Posted to tcl by dbohdan at Tue Sep 01 18:15:00 GMT 2020view pretty

# Author: ericm <ericm>
# Date:   Fri Jan 14 22:15:51 2000 +0000

#       sprintf(s, "Stardate %2d%03d.%01d",
#               (((t->tm_year + TM_YEAR_BASE) + 377) - 2323),
#               (((t->tm_yday + 1) * 1000) /
#                       (365 + IsLeapYear((t->tm_year + TM_YEAR_BASE)))),
#               (((t->tm_hour * 60) + t->tm_min)/144));

proc IsLeapYear x {
    expr {$x % 4 == 0 && ($x % 100 != 0 || $x % 400 == 0)}
}

proc stardate t {
    lassign [lmap x [clock format $t -format {%Y %j %H %M}] {
        string trimleft $x 0
    }] year yday hour min
    puts "$year $yday $hour $min"
    
    # We don't need to add TM_YEAR_BASE because our years are not counted from
    # 1900.  Our $yday starts from 1.

    format "Stardate %2d%03d.%01d" [expr {
        $year + 377 - 2323
    }] [expr {
        $yday * 1000 / (365 + [IsLeapYear $year])
    }] [expr {
        ($hour * 60 + $min) / 144
    }]
}