A Day: Perfect model vs Imperfect Reality
- Expectation:
1 Day = 24 Hours = 86,400.000s
- Reality:
1 Day ~ 24 Hours ~ 86,400.002s
(SI, mean)
1 Day is not exactly 24 hours Time And Date
1 Day (measured with Solar Time) is the time it takes the Earth to rotate around its own axis so the Sun appears in the “same position” in the sky.
It takes mean 1s/0.002s ~ 500
days to accumulate 1 second excess. This second is what’s called Leap Second.
A Day: Imperfections of the Perfect model
In order to keep up with the Solar Time the 1 second excess “is introduced” every once in a while.
To preserve “time progresses forward” invariant WallClock needs to add the 1 second excess(Leap Second) through imperfection as 23:59:60
.
Most computers, unable to represent 23:59:60, instead insert a clock reset and repeat 23:59:59.
T(n) : "23:59:59.995"
… spend/wait 10ms.
T(n+1) : "23:59:59.005"
computers are “spending” 1 second without progressing WallClock forward.
WallClock: Implications of not progressing forward
- Expectation: WallClock always progresses forward:
T(n) < T(n+1)
- Reality: WallClock may go backwards or not progress forward
T(n) >= T(n+1)
or T(n) - T(n+1) >= 0
or T(n+1) - T(n) <= 0
In other words a non-zero duration measured with WallClock may be negative or equal 0.
WallClock: implications in programming
It’s very common to have code that measures duration like this:
start := time.Now()
//
// ... do some stuff
//
dur := Time.Now().Sub(start)
if dur == 0 {
// do this
} else {
// do that
}
Without assuming imperfections, the above code may have false positives as described in:
The solution for Go was to maintain the invariant “time progresses forward” with monotonic time which was introduced in Go1.9
A Leap Day
Interestingly there’s also a Leap Day, an additional day to make up for ~365.25 days it takes the Earth to rotate around the Sun. Despite the similarities with the Leap Second the problems were avoided by introducing an extra day (aka Feb 29) and preserving the invariant “time progresses forward” in this case.