Swatch Internet Time

Difference between version 0 and 1 - Previous - Next
https://en.wikipedia.org/wiki/Swatch_Internet_Time%|%'''Swatch Internet Time'''%|% or '''.beat time''' is a decimal time format without [timezone%|%time zones].  It was introduced by the Swatch corporation to promote their of "Beat" watches.  Some products released around the year 2000 have integrated support for .beat time, as does the programming language [PHP].


** Tcl module **

[dbohdan] 2021-02-10: The following module can convert a `[clock seconds]` timestamp to .beat time and .beat time to seconds since midnight in [UTC].  It also works as a command line utility to display Swatch Internet Time.

======
#! /usr/bin/env tclsh
# Copyright (c) 2021 D. Bohdan.
# License: MIT.

namespace eval beat {
    variable version 0.3.0

    # [catch] for Jim Tcl compatibility.
    catch {
        namespace export format scan from* to*
        namespace ensemble create
    }
}

# Epoch time in seconds -> .beats.
proc beat::format t {
    # Add an hour to go from UTC to UTC+1 (CET).
    from-cet-seconds [expr { ($t + 3600) % 86400 }]
}

# B.beats -> seconds since midnight in UTC.
proc beat::scan beats {
    expr { ([to-cet-seconds $beats] - 3600) % 86400 }
}


proc beat::from-cet-seconds s {
    expr { int($s / 86.4) }
}


proc beat::to-cet-seconds beats {
    expr { round($beats * 86.4) }
}


proc beat::test {} {
    set ref {
        1000000000 115
        1100000000 523
        1200000000 930
        1300000000 337
        1400000000 745
        1500000000 152
        1600000000 560
        1700000000 967
        1800000000 375
        1900000000 782
        2000000000 189
        1612973550 717
    }

    set error {}

    dict for {timestamp expectedBeats} $ref {
        set actualBeats [format $timestamp]
        if {$expectedBeats != $actualBeats} {
            lappend error "$timestamp -> $expectedBeats (got $actualBeats)"
        }

        set actualS [scan $expectedBeats]
        set expectedS [expr { $timestamp % 86400 }]
        if {$expectedS - $actualS > 87} {
            lappend error "$expectedBeats -> $expectedS (got $actualS)"
        }
    }

    if {$error ne {}} {
        error "tests failed:\n[join $error \n]"
    }
}


proc beat::usage {} {
    puts stderr "usage: [file tail [info script]] \[(timestamp|\"test\")\]"
}


proc beat::main argv {
    switch [llength $argv] {
        0 {
            set timestamp [clock seconds]
        }
        1 {
            if {$argv eq {test}} {
                test
                exit 0
            }

            set timestamp $argv
            if {![string is integer -strict $timestamp]} {
                usage
                exit 1
            }
        }
        default {
            usage
            exit 1
        }
    }


    puts [format $timestamp]
}


# If this is the main script...
if {[info exists argv0] && ([file tail [info script]] eq [file tail $argv0])} {
    beat::main $argv
}
======


** See also **

   * [Star Trek] for stardate.


<<categories>> Application | Date and Time | Jim Package | Package