2012-04-05 1 views
3

ich einen TCL Skript geerbt (ich habe Null Vertrautheit mit der Sprache) und benötigen einen RFC 3339 Zeitstempel, um es hinzuzufügen:Wie kann ich einen RFC 3339-Zeitstempel in TCL erstellen?

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

Nach der Suche Google, ich habe keine Mittel gefunden, die Mikrosekunden anzuzeigen oder der Zeitzonen-Offset (Ich habe einen Weg gefunden, den Namen der Zeitzone anzuzeigen, aber das hilft nicht).
Gibt es eine Möglichkeit, dies zu tun, ohne einen externen Prozess aufzurufen?

+0

Ich glaube, das wird abhängig sein von Ihrer Version von TCL – resmon6

+1

@ resmon6 Der einzige problematische Teil wird die Millisekunden bekommen; das war vor 8.4 überhaupt nicht verfügbar, und die Syntax wurde in 8.5 geändert. –

Antwort

4

In tcl8.5, können Sie den folgenden Befehl versuchen:

% clock format [clock seconds] -format "%Y-%m-%dT%T%z" 
2012-04-05T16:06:07-0500 

, dass Sie alles außer der Auflösung von unter einer Sekunde gibt. Der Befehl clock microseconds gibt Ihnen die Zeit in Mikrosekunden, aber ich finde keine Formatstring-Kennung, die zu ihm passt. Damit können Sie Ihre eigenen Befehl von Grund auf neu bauen:

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] 
} 

Ausführen dieser Ergebnisse in einem Zeitstempel wie 2012-04-05T16:35:06.366378-05:00.

Edit: Aktualisierte Codebeispiel, um user1179884 die Tweaks (siehe Kommentare) zu integrieren und in ein proc.

+0

Ich tat dies: ' Regexp {(...) (..)} [Uhr Format [Uhr Sekunden] -Format"% z "] übereinstimmende Stunden Minuten zurück [Format"% s.% S% s:% s "[Zeitstempel-Format"% Y-% m-% dT% X "] [Ausdruck [Uhr Mikrosekunden]% 1000000] $ Stunden $ Minuten] 100000] $ Stunden $ Minuten]". Grundsätzlich das Gleiche, aber ich habe eine Regex verwendet, um einen Doppelpunkt in den Zeitzonen-Offset zu setzen, der in rfc3339 benötigt wird. – kwiqsilver

+0

Eine andere Sache notwendig ... Ich musste die "% s" für die Mikrosekunden auf "% 06s" ändern, um die führenden Nullen zu behalten. – kwiqsilver

+0

@ user1179884: Sie sollten genau aufschreiben, was Sie als Selbstantwort getan haben. (Das ist erlaubt!) Dann können wir zeigen, wie man die _exact_ Lösung für das Problem macht und sie auch abstimmen. –