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