1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
.Dd April 23, 2026
.Dt SFTTIME 7
.Os
.Sh NAME
.Nm sfttime
.Nd a hexadecimal time system based on fractional days
.Sh DESCRIPTION
.Nm
is an alternative representation of UTC time.
For example, 2026-04-23 at 13:37 UTC (the start of sft day 5056) is written:
.Pp
.Dl 5056.000[sft]
.Pp
Time is expressed as a hexadecimal count of days since the
.Nm
epoch, with a fractional component for sub-day precision.
It is very regular, and timestamps are concise: a full timestamp with
second-level precision fits in 12 characters.
It is also a good fit for shell prompts and status lines, where only
the sub-day part is needed — that requires only five characters, for
example the start of the
.Nm
day (13:37 UTC) is
.Li .0000 ,
and noon UTC is
.Li .EEC0 .
.Sh FORMAT
A full
.Nm
timestamp looks like:
.Pp
.Dl DDDD.FFF[sft]
.Pp
Where:
.Bl -tag -width indent
.It Ar DDDD
Hexadecimal count of days since the
.Nm
epoch. Grows by 1 each day.
.It Ar .FFF
Fractional part of the current day in hexadecimal.
Three digits give a resolution of
.Li 1/4096
of a day, approximately 21 seconds (one vergil).
Four digits give a resolution of
.Li 1/65536
of a day, approximately 1.3 seconds (one tick).
.It Ar [sft]
Optional suffix indicating the value is in
.Nm .
May be omitted in contexts where it is unambiguous.
.El
.Pp
The sub-day compact form omits the date entirely and is written as:
.Pp
.Dl .F3C9
.Pp
This is useful for timestamps where the date is known from context,
such as log entries or status lines within a running session.
Adding a fifth digit gives ~82ms precision (roughly 1/10 of a second),
and a sixth digit gives millisecond-level precision (~5ms):
.Pp
.Dl .F3C9A4
.Sh EPOCH
The
.Nm
epoch is
.Sy 1970-01-01 13:37:00 UTC ,
which is
.Li 49020
seconds after the Unix epoch (1970-01-01 00:00:00 UTC).
The choice of 13:37 is intentional.
.Sh UNITS
Each power of 16 in the fractional part has a name:
.Bl -column "[sft]-1 (major)" "~5.6 minutes" ".0000[sft]" "Description" -compact
.It Sy Unit Ta Sy Duration Ta Sy Example Ta Sy Name
.It Li [sft]0 Ta 1 day Ta Li 1.0000[sft] Ta day
.It Li [sft]-1 Ta 1.5 hours Ta Li .1000[sft] Ta major (one university lecture)
.It Li [sft]-2 Ta ~5.6 minutes Ta Li .0100[sft] Ta schinken
.It Li [sft]-3 Ta ~21 seconds Ta Li .0010[sft] Ta vergil
.It Li [sft]-4 Ta ~1.3 seconds Ta Li .0001[sft] Ta tick
.El
.Sh EXAMPLES
Converting the current time:
.Bd -literal -offset indent
$ sfttime
5055.F3C[sft]
.Ed
.Pp
A compact sub-day timestamp as used in status lines:
.Bd -literal -offset indent
.F3C9
.Ed
.Pp
These timestamps represent the same moment expressed at different precisions:
.Bl -column "5055.F3C9[sft]" "Description" -compact
.It Sy Timestamp Ta Sy Precision
.It Li 5055[sft] Ta day (24h)
.It Li 5055.F[sft] Ta major (1.5h)
.It Li 5055.F3[sft] Ta schinken (~5.6min)
.It Li 5055.F3C[sft] Ta vergil (~21s)
.It Li 5055.F3C9[sft] Ta tick (~1.3s)
.El
.Sh CONVERSION
To convert a
.Nm
timestamp to Unix time:
.Pp
.Dl unix = hex_to_decimal(sfttime) * 86400 + 49020
.Pp
To convert Unix time to
.Nm :
.Pp
.Dl sfttime = decimal_to_hex((unix - 49020) / 86400)
.Sh TIDBITS
The name
.Sq sft
is the clan name of a group of friends from Munich, Bavaria.
.Sh SEE ALSO
.Xr date 1
.Bl -tag -width indent
.It Coordinated Universal Time (UTC)
.Li https://en.wikipedia.org/wiki/Coordinated_Universal_Time
.It dot-time \(em a universal convention for conveying time
.Li https://dotti.me/
.El
.Sh HISTORY
.Nm
was created in
.Li 3BBE.81[sft]
(approximately 2013).
|