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

Mic*_*eal 1 tcl

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

set $future_date ""
#set $future_date to date in unixtime stamp 90 days from the current timestamp
Run Code Online (Sandbox Code Playgroud)

我可以在tcl中这样做吗?

Don*_*ows 5

这样做的方法是使用clock add:

# The [clock seconds] produces _now_
set future_date [clock add [clock seconds] 90 days]
set future_readable [clock format $future_date]
Run Code Online (Sandbox Code Playgroud)

好的,这几乎是正确的.首先,在一些地方,它在大约半年内不起作用.问题?他们有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...
Run Code Online (Sandbox Code Playgroud)

第二个问题是这忽略了闰秒.请注意,如果您没有编写GPS软件或其他同样敏感的东西,这可能正是您想要的(如果您真的关心,您可能有适当的软件/算法来应用修正).

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

set future_date [clock scan "now + 90 days"]
set future_readable [clock format $future_date]
Run Code Online (Sandbox Code Playgroud)

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


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