我继承了TCL脚本(我有零熟悉的语言),并需要一个RFC 3339时间戳添加到它:如何在TCL中创建RFC 3339时间戳?
2012-04-05T12:13:32.123456-08:00
谷歌搜索后,我还没有发现显示微秒的任何手段或时区偏移量(我找到了一种显示时区名称的方法,但这没有帮助)。
有没有办法做到这一点,而无需调用外部进程?
我继承了TCL脚本(我有零熟悉的语言),并需要一个RFC 3339时间戳添加到它:如何在TCL中创建RFC 3339时间戳?
2012-04-05T12:13:32.123456-08:00
谷歌搜索后,我还没有发现显示微秒的任何手段或时区偏移量(我找到了一种显示时区名称的方法,但这没有帮助)。
有没有办法做到这一点,而无需调用外部进程?
在TCL8.5,你可以试试下面的命令:
% clock format [clock seconds] -format "%Y-%m-%dT%T%z"
2012-04-05T16:06:07-0500
这使你除了亚秒分辨率的一切。 clock microseconds
命令将以微秒为单位给出时间,但我找不到与之匹配的格式字符串标识符。您可以使用此从头开始构建自己的命令:
proc timestamp_rfc3339 {} {
set us [clock microseconds]
set sec [expr {$us/1000000}]
set micro [expr {$us % 1000000}]
set ts [clock format $sec -format "%Y-%m-%dT%T"]
regexp {(...)(..)} [clock format $sec -format "%z"] matched tzh tzm
return [format "%s.%06s%s:%s" $ts $micro $tzh $tzm]
}
运行这导致像2012-04-05T16:35:06.366378-05:00
时间戳。
编辑:更新的代码示例合并user1179884的调整(请参阅评论)并包装在一个proc中。
我这样做:' regexp {(...)(..)} [时钟格式[时钟秒]格式“%z”]匹配小时分钟 返回[格式“%s。%s%s:% s“[timestamp -format'%Y-%m-%dT%X”] [expr [clock microseconds]%1000000] $ hours $ minutes] 100000] $ hours $ minutes]'。基本上是一样的,但我用一个正则表达式在时区偏移量中放置一个冒号,这在rfc3339中是必需的。 – kwiqsilver 2012-04-05 22:12:31
另一件必要的事情......我必须将微秒的“%s”更改为“%06s”以保持前导零。 – kwiqsilver 2012-04-05 22:31:48
@ user1179884:你应该记下你自己做了什么。 (这是允许的!)然后,我们可以展示如何对问题做出_exact_解决方案,并将其投票。 – 2012-04-06 05:51:49
我相信这将取决于您的TCL版本 – resmon6 2012-04-05 19:45:26
@ resmon6唯一有问题的部分将获得毫秒;在8.4之前完全不可用,并且语法在8.5中改变。 – 2012-04-06 05:54:02