1

嗨,我想设置我的 future_date 变量以显示从今天起 90 天的日期。

set $future_date ""
#set $future_date to date in unixtime stamp 90 days from the current timestamp

我可以在 tcl 中做到这一点吗?

4

2 回答 2

5

这样做的方法是使用clock add

# The [clock seconds] produces _now_
set future_date [clock add [clock seconds] 90 days]
set future_readable [clock format $future_date]

好的,这几乎是正确的。首先,它在某些地区大约半年都不起作用。问题?他们有 DST 变化,这意味着一天的长度实际上不是恒定的(有时,民事日为 23 或 25 小时)。但是,应用这种校正需要​​了解当前时区(因为世界不同地区有不同的规则)。时区是参考zoneinfo 数据库指定的:

set zone ":America/New_York"
set future_date [clock add [clock seconds] 90 days -timezone $zone]
set future_readable [clock format $future_date -timezone $zone]
# Normally should use the same timezone for each *unless* there's a
# business reason to do otherwise...

第二个问题是这忽略了闰秒。请注意,如果您不是在编写 GPS 软件或其他同样敏感的软件,这可能正是您想要的(如果您真的很在意,您可能有合适的软件/算法来应用校正)。

第三个问题是这只能从 8.5 开始工作(当clock命令几乎从头开始重写时;我们厌倦了处理其他人在时间处理方面的错误并决定只拥有我们自己的错误!)所以如果你仍然保守地使用8.4(或之前!)然后你需要一个不同的咒语:

set future_date [clock scan "now + 90 days"]
set future_readable [clock format $future_date]

这不是首选,因为它没有正确处理时区(嗯,可能使用当前系统时区或可能使用 UTC[*]),并且构建在高度不明显的时间字符串解析器之上。然而,尽管如此,它是 8.5 之前的最佳选择。


[*] 不要低估这有多奇怪;我记得处理过第三方打印机驱动程序中的错误,当加载到 Windows 上的单独进程中时,会更改所有正在运行的应用程序的系统时区,直到打印运行完成。即使确认实际发生的事情也很困难(就像后来把我的下巴从地板上抬起一样)。

于 2012-06-05T00:18:57.080 回答
2

在 Tcl 中,该clock seconds命令以秒为单位返回现在的时间。要添加 90 天,您必须将 90 乘以 60(一分钟的秒数)、60(一小时的分钟数)和 24(一天的小时数):

set today [clock seconds]
set future [expr {$today + 90 * 60 * 60 * 24}]
puts [clock format $today -format "Today is %B %m, %Y"]
puts [clock format $future -format "90 days from today is %B %m, %Y"]

请查看clock命令以获取更多信息。

于 2012-06-04T20:50:52.077 回答