您好我想设置我的future_date变量,以显示从今天起90天的日期。
set $future_date ""
#set $future_date to date in unixtime stamp 90 days from the current timestamp
我能在tcl中做到吗?
答案 0 :(得分: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 database:
指定的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上的单独进程时会更改所有正在运行的应用程序的系统时区,直到打印运行完成。即使确认实际发生的事情也很困难(就像之后从地板上扯下来一样)。
答案 1 :(得分: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
命令以获取更多信息。