tclsh 对于unix时间的转换

公司业务基于tcl8.6进行开发,但是在时间调用函数上,公司提供的tcl8.6版本clock函数发非常诡异(也有可能是一些其他原因不去深究),在使用clock format转换unix时间时会报错: $ tclsh8.6 % puts [clock format [clock seconds] -

公司业务基于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
% 

杀割!