我正在使用IBM提供的示例程序amqsevt来监视MQ事件队列并解析消息。但我注意到,默认情况下,事件创建时间以GMT时间表示。我想将它转换为系统本地时间。有没有办法实现这个目标?
**** Message #1 (120 Bytes) on Queue SYSTEM.ADMIN.CHANNEL.EVENT ****
Event Type : Channel Event [46]
Reason : Channel Stopped By User [2279]
Event created : 2018/09/04 20:17:39.48 GMT
可以在/opt/mqm
的/opt/mqm/samp/amqsevta.c
上安装MQ的Linux上找到该示例的源代码。
在每条消息的MQMD
(消息描述符)中,有一个PutDate
和PutTime
字段,它总是存储在GMT中,例如每个简单的8位字符串:
在示例程序中,它只是将其转换为2018/09/04 20:17:39.48
的显示格式,并将GMT
追加到最后,因为它知道这总是在GMT中。
/**********************************************************/
/* Timestamp is read from the MQMD - it is always in GMT */
/* regardless of local timezone. Do not want to try to */
/* convert it, because this machine may be a client in a */
/* different timezone than the server generating the */
/* event. So stick to GMT (or UCT if you prefer). */
/**********************************************************/
sprintf(valbuf,"%4.4s/%2.2s/%2.2s %2.2s:%2.2s:%2.2s.%2.2s GMT",
&pMsgDesc->PutDate[0],
&pMsgDesc->PutDate[4],
&pMsgDesc->PutDate[6],
&pMsgDesc->PutTime[0],
&pMsgDesc->PutTime[2],
&pMsgDesc->PutTime[4],
&pMsgDesc->PutTime[6]);
printLine(offset,"Event created",valbuf);
看起来你可以使用c函数strptime
将字符串解析为一个纪元时间戳,然后在你当地的时区打印。