2012-04-05 100 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