以本地时间解析 IBM MQ Event Monitoring 消息

Parse IBM MQ Event Monitoring messages in local time

我正在使用 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

示例的源代码可以在 Linux 上找到,MQ 安装在 /opt/mqm/opt/mqm/samp/amqsevta.c

在每条消息的 MQMD(消息描述符)中,有一个 PutDatePutTime 字段,它们始终以 GMT 格式存储,每个都是简单的 8 位字符串,例如:

  • PutDate: 20180904 (YYYYMMDD)
  • PutTime: 20173948 (HHMMSSSS)

在示例程序中,它只是将其转换为 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 将字符串解析为纪元时间戳,然后以您当地的时区打印。