从Tcl中的历元开始获取特定时间的秒数

从Tcl中的历元开始获取特定时间的秒数,tcl,clock,Tcl,Clock,我正在尝试将以下格式的日期/时间yyyyddmmhmm转换为Tcl中自纪元起的秒数 我已尝试使用以下方法执行此操作,但无效: 时钟扫描201403251850-格式%Y%m%d%H%m 对于以上内容,我正在尝试将2014年3月25日下午6:50的时间转换为epoc之后的秒数 我怎样才能做到这一点 Chris我在Tcl 8.3.3上测试了这一点,因此应该与8.0配合使用:regex可能需要一些调整以适应8.1之前的regexp引擎 proc scan_datetime {datetime} {

我正在尝试将以下格式的日期/时间
yyyyddmmhmm
转换为Tcl中自纪元起的秒数

我已尝试使用以下方法执行此操作,但无效:

时钟扫描201403251850-格式%Y%m%d%H%m

对于以上内容,我正在尝试将2014年3月25日下午6:50的时间转换为epoc之后的秒数

我怎样才能做到这一点


Chris

我在Tcl 8.3.3上测试了这一点,因此应该与8.0配合使用:regex可能需要一些调整以适应8.1之前的regexp引擎

proc scan_datetime {datetime} {
    # expect a datetime string like "6:50PM on March 25th, 2014"
    regexp {^([0-9]+):([0-9]{2})([AP]M) on ([[:alpha:]]+) ([0-9]{1,2}).., ([0-9]{4})} $datetime -> hr min ampm mon day year
    if {$ampm == "PM"} then {incr hr 12} elseif {$hr == 12} then {set hr 0}
    clock scan "$day $mon $year $hr:$min"
}
puts [clock format [scan_datetime "6:50PM on March 25th, 2014"]]
puts [clock format [scan_datetime "12:34AM on February 1st, 2012"]]
如果上述正则表达式在8.0中不起作用,请尝试以下操作:

proc scan_datetime {datetime} {
    set d {[0-9]}
    set a {[A-Za-z]}
    regexp "^($d$d?):($d$d)(\[AP]M) on ($a+) ($d$d?).., ($d$d$d$d)" $datetime -> hr min ampm mon day year
    if {$ampm == "PM"} then {incr hr 12} elseif {$hr == 12} then {set hr 0}
    clock scan "$day $mon $year $hr:$min"
}

特别是对于格式YYYYmmddHHMM:

tcl8.3.3 % set t 201403251452
201403251452
tcl8.3.3 % set d {[0-9]}
[0-9]
tcl8.3.3 % regsub "($d$d$d$d)($d$d)($d$d)($d$d)($d$d)" $t {\2/\3/\1 \4:\5} tt
1
tcl8.3.3 % clock scan $tt
1395773520
tcl8.3.3 % clock format [clock scan $tt]
Tue Mar 25 14:52:00 EDT 2014

您从上述命令中获得的值是多少?我得到了对我来说似乎正确的
1395759000
。。。唯一看起来不对劲的是,您要求的是
yyyydmmhmm
,但使用的是
%Y%m%d%H%m
@Jerry,嘿,Jerry,我收到一个错误
切换错误“-format”:执行时必须是-base或-gmt
%Y%m%d%H%m
输入时间字符串的格式是否正确?我无法重现您的错误。我不确定这是否有影响,但您使用的是什么Tcl版本?在你的问题中,你可能指的是
YYYYMMDDHHmm
,这就是我要引起注意的地方。@Jerry,我在TCL v8.08.0?那真是。。。古老的有可能升级到至少8.5吗?回答得很好,格伦!我想我一定可以用这个!如果不太麻烦的话,您能稍微解释一下
regexp
regsub
部分吗?感谢文档在这里:--您有什么特别需要我解释的吗?特别是
{\2/\3/\1\4:\5}
部分。我发现它正在定位
($d$d$d$d)($d$d)($d$d)($d$d)($d$d)
部分,但我找不到任何关于这方面的文档。你能详细介绍一下它是如何工作的吗?谢谢,我想将日期字段重新排列为
时钟扫描
将使用的格式:将
YYYYmmddHHMM
转换为
mm/dd/YYYY HH:mm
。我在模式中使用捕获括号。您可以在替换字符串中用
\n
引用它们,其中“n”表示第一个开括号为1,第二个开括号为2,以此类推。这记录在
regsub
手册页中:
tcl8.3.3 % set t 201403251452
201403251452
tcl8.3.3 % set d {[0-9]}
[0-9]
tcl8.3.3 % regsub "($d$d$d$d)($d$d)($d$d)($d$d)($d$d)" $t {\2/\3/\1 \4:\5} tt
1
tcl8.3.3 % clock scan $tt
1395773520
tcl8.3.3 % clock format [clock scan $tt]
Tue Mar 25 14:52:00 EDT 2014