tcl 时钟扫描 snmp 日期时间格式
tcl clock scan snmp Date Time format
标准的snmp
DateTime
格式如下。
http://net-snmp.sourceforge.net/docs/mibs/host.html#DateAndTime
"2016-10-3,2:15:27.0,-4:0"
现在我正在尝试使用 tcl 的 clock scan
将此值转换为 epoch
我认为 here 中用于扫描的格式选项不支持小数秒和时区。
% clock scan $value2 -format {%Y-%m-%d %H:%M:%S}
input string does not match supplied format
我已经设法将值拆分为日期、时间和时区。
% set value "2016-10-3,2:15:27.0,-4:0"
2016-10-3,2:15:27.0,-4:0
% set value [split $value ,]
2016-10-3 2:15:27.0 -4:0
% lassign $value date time timeZone
%
这之后我该如何进行?
您可以这样进行(检查每个步骤的扫描结果:这当然都不是最终结果):
clock scan $date -format %Y-%N-%e
lassign [split $time .] t d
clock scan $t -format %k:%M:%S
您必须决定如何处理十分之一秒部分(在 d
中)。
lassign [split $timeZone :] h m ; # or:
scan $timeZone %d:%d h m
clock scan [format {%+03d%02d} $h $m] -format %z
具体使用什么 clock
字段说明符取决于基本格式:根据需要进行调整。 AFAICT 这些说明符匹配格式。
获取最终时间值:
clock scan "$date $t [format {%+03d%02d} $h $m]" -format "%Y-%N-%e %k:%M:%S %z"
有问题的第一部分是小数秒。此外,时区不是我们可以支持的形式(我们只能做这么多;我们专注于使解析器能够处理 ISO 时间戳格式的公共部分)。
但是,这确实意味着我们可以很容易地清理干净。这有几个步骤,我们将使用 regexp
、scan
和 format
来帮助:
# Your example, in a variable for my convenience
set instant "2016-10-3,2:15:27.0,-4:0"
# Take apart the problem piece; REs are *great* for string parsing!
regexp {^(.+)\.(\d+),(.+)$} $instant -> timepart fraction timezone
# Fix the timezone format; we use [scan] for semantic parsing...
set timezone [format "%+03d%02d" {*}[scan $timezone "%d:%d"]]
# Parse the time properly now that we can understand all the pieces
set timestamp [clock scan "$timepart $timezone" -format "%Y-%m-%d,%k:%M:%S %z"]
让我们检查一下是否产生了正确的输出类型(这是在交互式会话中):
% clock format $timestamp
Mon Oct 03 07:15:27 BST 2016
我觉得不错。我想你可以在最后添加原始瞬间的小数部分,但 clock format
不会喜欢它。
标准的snmp
DateTime
格式如下。
http://net-snmp.sourceforge.net/docs/mibs/host.html#DateAndTime
"2016-10-3,2:15:27.0,-4:0"
现在我正在尝试使用 tcl 的 clock scan
epoch
我认为 here 中用于扫描的格式选项不支持小数秒和时区。
% clock scan $value2 -format {%Y-%m-%d %H:%M:%S}
input string does not match supplied format
我已经设法将值拆分为日期、时间和时区。
% set value "2016-10-3,2:15:27.0,-4:0"
2016-10-3,2:15:27.0,-4:0
% set value [split $value ,]
2016-10-3 2:15:27.0 -4:0
% lassign $value date time timeZone
%
这之后我该如何进行?
您可以这样进行(检查每个步骤的扫描结果:这当然都不是最终结果):
clock scan $date -format %Y-%N-%e
lassign [split $time .] t d
clock scan $t -format %k:%M:%S
您必须决定如何处理十分之一秒部分(在 d
中)。
lassign [split $timeZone :] h m ; # or:
scan $timeZone %d:%d h m
clock scan [format {%+03d%02d} $h $m] -format %z
具体使用什么 clock
字段说明符取决于基本格式:根据需要进行调整。 AFAICT 这些说明符匹配格式。
获取最终时间值:
clock scan "$date $t [format {%+03d%02d} $h $m]" -format "%Y-%N-%e %k:%M:%S %z"
有问题的第一部分是小数秒。此外,时区不是我们可以支持的形式(我们只能做这么多;我们专注于使解析器能够处理 ISO 时间戳格式的公共部分)。
但是,这确实意味着我们可以很容易地清理干净。这有几个步骤,我们将使用 regexp
、scan
和 format
来帮助:
# Your example, in a variable for my convenience
set instant "2016-10-3,2:15:27.0,-4:0"
# Take apart the problem piece; REs are *great* for string parsing!
regexp {^(.+)\.(\d+),(.+)$} $instant -> timepart fraction timezone
# Fix the timezone format; we use [scan] for semantic parsing...
set timezone [format "%+03d%02d" {*}[scan $timezone "%d:%d"]]
# Parse the time properly now that we can understand all the pieces
set timestamp [clock scan "$timepart $timezone" -format "%Y-%m-%d,%k:%M:%S %z"]
让我们检查一下是否产生了正确的输出类型(这是在交互式会话中):
% clock format $timestamp
Mon Oct 03 07:15:27 BST 2016
我觉得不错。我想你可以在最后添加原始瞬间的小数部分,但 clock format
不会喜欢它。