SNMP DateAndTime十六进制字符串在PHP中转换为人类日期

时间:2014-04-23 13:16:34

标签: php date snmp

当我想通过SNMP获取cablemodem事件日志时,我会轻拍“mib-2.69.1.5.8.1' oid,但我遇到了问题,因为SNMP将每个事件日期存储在' special'十六进制字符串,称为DateAndTime格式。

(在我的例子中,这是一个8字节的十六进制字符串,如下所示:07 B2 01 01 00 0A 14 00)

我想转换为人类约会,像这样(1970.01.01.00:10),所以我写了一个PHP函数:

function hex2date( $hexstring ) {
  $date = "";

  $p = unpack( "H*", substr( $hexstring, 0, 2 ) );  // year (2 byte)
  $date .= hexdec( $p[1] ).".";

  $p = unpack( "H*", substr( $hexstring, 2, 1 ) );  // month (1 byte)
  $date .= sprintf( "%02s", hexdec( $p[1] ) ).".";

  $p = unpack( "H*", substr( $hexstring, 3, 1) );   // day (1 byte)
  $date .= sprintf( "%02s", hexdec( $p[1] ) ).". ";

  $p = unpack( "H*", substr( $hexstring, 4, 1 ) );  // hour (1 byte)
  $date .= sprintf( "%02s", hexdec( $p[1] ) ).":";

  $p = unpack( "H*", substr( $hexstring, 5, 1 ) );  // minute (1 byte)
  $date .= sprintf( "%02s", hexdec( $p[1] ) );

  return ($date);
}

这是工作,但出于某种原因,我认为这不是最优雅的解决方案。 我是对的吗?

1 个答案:

答案 0 :(得分:3)

对于来自Google的旅行者,在这种情况下,设备会发送一个8字节的SNMP DateAndTime值,而不会显示时区信息。查看我在下面链接的手册。但是,获取时区信息遵循相同的原则。


您的代码应如下所示:

// Prepare test data
$binstring = "\x07\xB2\x01\x01\x00\x0A\x14\x00";

$values = unpack('nyear/Cmonth/Cday/Chour/Cminute/Csecond/Cdecisecond', $binstring);
var_dump($values);

输出:

array(7) {
  'year' =>
  int(1970)
  'month' =>
  int(1)
  'day' =>
  int(1)
  'hour' =>
  int(0)
  'minute' =>
  int(10)
  'second' =>
  int(20)
  'decisecond' =>
  int(0)
}

请参阅以下手册页: