2012-04-05 31 views
3

我继承了TCL脚本(我有零熟悉的语言),并需要一个RFC 3339时间戳添加到它:如何在TCL中创建RFC 3339时间戳?

2012-04-05T12:13:32.123456-08:00

谷歌搜索后,我还没有发现显示微秒的任何手段或时区偏移量(我找到了一种显示时区名称的方法,但这没有帮助)。
有没有办法做到这一点,而无需调用外部进程?

+0

我相信这将取决于您的TCL版本 – resmon6 2012-04-05 19:45:26

+1

@ resmon6唯一有问题的部分将获得毫秒;在8.4之前完全不可用,并且语法在8.5中改变。 – 2012-04-06 05:54:02

回答

4

在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中。

+0

我这样做:' 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

+0

另一件必要的事情......我必须将微秒的“%s”更改为“%06s”以保持前导零。 – kwiqsilver 2012-04-05 22:31:48

+0

@ user1179884:你应该记下你自己做了什么。 (这是允许的!)然后,我们可以展示如何对问题做出_exact_解决方案,并将其投票。 – 2012-04-06 05:51:49