从当前的unix时间戳设置日期为90天

时间:2012-06-04 20:06:35

标签: tcl

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

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

我能在tcl中做到吗?

2 个答案:

答案 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命令以获取更多信息。