如何在TCL中创建RFC 3339时间戳?

如何在TCL中创建RFC 3339时间戳?,tcl,Tcl,我继承了一个TCL脚本(我对该语言不熟悉),需要向其添加RFC 3339时间戳: 2012-04-05T12:13:32.123456-08:00 2012-04-05T12:13:32.123456-08:00 在搜索Google之后,我没有找到任何显示微秒或时区偏移的方法(我找到了显示时区名称的方法,但这没有帮助)。 有没有一种方法可以在不调用外部进程的情况下执行此操作?在TCL8.5中,您可以尝试以下命令: % clock format [clock seconds] -format "%

我继承了一个TCL脚本(我对该语言不熟悉),需要向其添加RFC 3339时间戳:

2012-04-05T12:13:32.123456-08:00 2012-04-05T12:13:32.123456-08:00 在搜索Google之后,我没有找到任何显示微秒或时区偏移的方法(我找到了显示时区名称的方法,但这没有帮助)。

有没有一种方法可以在不调用外部进程的情况下执行此操作?

在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


编辑:更新了代码示例,以合并用户1179884的调整(请参见注释)并将其包装在一个过程中。

我相信这将取决于您的版本TCL@resmon6唯一有问题的部分是获取毫秒数;这在8.4之前根本不可用,语法在8.5中发生了更改。我这样做了:`regexp{(…)(…)}[clock format[clock seconds]-format”%z“]matched hours minutes return[format”%s.%s%s:%s“[timestamp-format”%Y-%m-%dT%X”][expr[时钟微秒]$1000000]$hours$minutes]100000$hours$minutes]`。基本相同,但我使用正则表达式在时区偏移量中添加了冒号,这在rfc3339中是必需的。还有一件必要的事情……我必须将微秒的“%s”更改为“%06s”,以保持前导零。@user1179884:您应该准确地写下您所做的自我回答。(这是允许的!)然后我们可以展示如何精确地解决问题,并投票表决。@user1179884-为了完整起见,我将编辑我的答案并合并您的调整。