公司业务基于tcl8.6进行开发,但是在时间调用函数上,公司提供的tcl8.6版本clock函数发非常诡异(也有可能是一些其他原因不去深究),在使用clock format转换unix时间时会报错:
$ tclsh8.6
% puts [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S"]
:Tcl/Localtime]
% clock seconds
1719389506
% clock format [clock seconds]
:Tcl/Localtime]
%
于是乎只有手动转换unix时间,在转换的时候一定要考虑时区影响!
在例子中使用了GMT+8 标准的中国时间
proc unix_time_to_readable {unix_time {timezone 8}} {
# 调整时区
set unix_time [expr {$unix_time + $timezone * 3600}]
set seconds [expr {$unix_time % 60}]
set minutes [expr {($unix_time / 60) % 60}]
set hours [expr {($unix_time / 3600) % 24}]
set days [expr {$unix_time / 86400}]
set year 1970
set month 1
set day 1
# 处理闰年
while {$days > 365} {
if {($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)} {
if {$days > 366} {
incr year
incr days -366
} else {
break
}
} else {
incr year
incr days -365
}
}
# 计算月和日
set month_days {31 28 31 30 31 30 31 31 30 31 30 31}
if {($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)} {
lset month_days 1 29
}
foreach md $month_days {
if {$days < $md} {
break
}
incr month
incr days -$md
}
incr day $days
return [format "%04d-%02d-%02d %02d:%02d:%02d" $year $month $day $hours $minutes $seconds]
}
处理完之后的效果如下;
%
% unix_time_to_readable [clock seconds]
2024-06-26 16:15:15
%
杀割!