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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sfttime(7)</title>
<meta name="description" content="sfttime — a hexadecimal time system based on fractional days">
<meta property="og:title" content="sfttime(7)">
<meta property="og:description" content="sfttime — a hexadecimal time system based on fractional days">
<meta property="og:type" content="website">
<meta property="og:url" content="https://sfttime.softwaregardening.org">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="sfttime(7)">
<meta name="twitter:description" content="sfttime — a hexadecimal time system based on fractional days">
<link rel="canonical" href="https://sfttime.softwaregardening.org">
<style>
*, *::before, *::after { box-sizing: border-box; }
body {
font-family: monospace;
font-size: 16px;
line-height: 1.4;
max-width: 78ch;
margin: 0 auto;
padding: 1.5em 1em;
background: #fff;
color: #000;
}
@media (prefers-color-scheme: dark) {
body { background: #1a1a1a; color: #ccc; }
table { border-color: #555; }
td, th { border-color: #555; }
}
/* header and footer bars */
.manheader, .manfooter {
display: flex;
justify-content: space-between;
margin-bottom: 1.5em;
}
.manfooter {
margin-top: 2em;
margin-bottom: 0;
}
.manheader-center, .manfooter-center {
text-align: center;
flex: 1;
}
/* sections: h2 at left margin, content indented */
section h2 {
font-size: 1em;
font-weight: bold;
margin: 1.5em 0 0.25em 0;
text-transform: uppercase;
}
section > :not(h2) {
margin-left: 0;
}
p {
margin: 0.5em 0;
text-align: justify;
}
/* indented code examples */
pre {
margin-top: 0.75em;
margin-bottom: 0.75em;
padding-left: 2ch;
font-family: monospace;
font-size: 1em;
}
@media (min-width: 40em) {
section > :not(h2) {
margin-left: 7ch;
}
pre {
padding-left: 5ch;
}
}
pre code {
font-weight: bold;
}
/* definition list for FORMAT section */
dl {
margin: 0.5em 0;
}
dt {
float: left;
clear: left;
width: 2ch;
font-weight: normal;
text-decoration: underline;
}
dt code {
font-weight: normal;
}
dd {
margin-left: 2ch;
margin-bottom: 0.5em;
}
@media (min-width: 40em) {
dt { width: 7ch; }
dd { margin-left: 7ch; }
}
@media (max-width: 39.99em) {
dt { float: none; width: auto; }
dd { margin-left: 2ch; }
}
/* tables */
table {
border-collapse: collapse;
margin: 0.75em 0;
}
td {
border: 1px solid #000;
padding: 0.3em 1ch;
text-align: left;
font-weight: normal;
}
th {
border: 1px solid #000;
padding: 0.3em 1ch;
text-align: left;
}
/* see also: wider dt for full link labels */
.seealso dt {
width: auto;
float: none;
text-decoration: none;
margin-bottom: 0.1em;
}
.seealso dd {
margin-left: 2ch;
margin-bottom: 0.75em;
}
@media (min-width: 40em) {
.seealso dd { margin-left: 7ch; }
}
@media (max-width: 39.99em) {
.seealso dd { margin-left: 2ch; }
}
code {
font-weight: bold;
}
</style>
</head>
<body>
<header class="manheader">
<span>SFTTIME(7)</span>
<span class="manheader-center">Miscellaneous Information Manual</span>
<span>SFTTIME(7)</span>
</header>
<section>
<h2>Name</h2>
<p>sfttime — a hexadecimal time system based on fractional days</p>
</section>
<section>
<h2>Description</h2>
<p><code>sfttime</code> is an alternative representation of UTC time. For example,
2026-04-23 at 13:37 UTC (the start of sft day 5056) is written:</p>
<pre><code>5056.000[sft]</code></pre>
<p>Time is expressed as a hexadecimal count of days since the <code>sfttime</code>
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
<code>sfttime</code> day (13:37 UTC) is <code>.0000</code>, and noon UTC is
<code>.EEC0</code>.</p>
</section>
<section>
<h2>Format</h2>
<p>A full <code>sfttime</code> timestamp looks like:</p>
<pre><code>DDDD.FFF[sft]</code></pre>
<p>Where:</p>
<dl>
<dt><code>DDDD</code></dt>
<dd>Hexadecimal count of days since the <code>sfttime</code> epoch. Grows by 1 each day.</dd>
<dt><code>.FFF</code></dt>
<dd>Fractional part of the current day in hexadecimal. Three digits give a
resolution of <code>1/4096</code> of a day, approximately 21 seconds (one vergil). Four
digits give a resolution of <code>1/65536</code> of a day, approximately 1.3 seconds
(one tick).</dd>
<dt><code>[sft]</code></dt>
<dd>Optional suffix indicating the value is in <code>sfttime</code>. May be omitted in
contexts where it is unambiguous.</dd>
</dl>
<p>The sub-day compact form omits the date entirely and is written as:</p>
<pre><code>.F3C9</code></pre>
<p>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):</p>
<pre><code>.F3C9A4</code></pre>
</section>
<section>
<h2>Epoch</h2>
<p>The <code>sfttime</code> epoch is <time datetime="1970-01-01T13:37:00Z">1970-01-01 13:37:00 UTC</time>, which is
<code>49020</code> seconds after the Unix epoch (<time datetime="1970-01-01T00:00:00Z">1970-01-01 00:00:00 UTC</time>). The choice of
13:37 is intentional.</p>
</section>
<section>
<h2>Units</h2>
<p>Each power of 16 in the fractional part has a name:</p>
<table>
<thead>
<tr><th>Unit</th><th>Duration</th><th>Example</th><th>Name</th></tr>
</thead>
<tbody>
<tr><td><code>[sft]0</code></td><td>1 day</td><td><code>1.0000[sft]</code></td><td>day</td></tr>
<tr><td><code>[sft]-1</code></td><td>1.5 hours</td><td><code>.1000[sft]</code></td><td>major (one university lecture)</td></tr>
<tr><td><code>[sft]-2</code></td><td>~5.6 minutes</td><td><code>.0100[sft]</code></td><td>schinken</td></tr>
<tr><td><code>[sft]-3</code></td><td>~21 seconds</td><td><code>.0010[sft]</code></td><td>vergil</td></tr>
<tr><td><code>[sft]-4</code></td><td>~1.3 seconds</td><td><code>.0001[sft]</code></td><td>tick</td></tr>
</tbody>
</table>
</section>
<section>
<h2>Examples</h2>
<p>Converting the current time:</p>
<pre><code>$ sfttime
5055.F3C[sft]</code></pre>
<p>A compact sub-day timestamp as used in status lines:</p>
<pre><code>.F3C9</code></pre>
<p>These timestamps represent the same moment expressed at different precisions:</p>
<table>
<thead>
<tr><th>Timestamp</th><th>Precision</th></tr>
</thead>
<tbody>
<tr><td><code>5055[sft]</code></td><td>day (24h)</td></tr>
<tr><td><code>5055.F[sft]</code></td><td>major (1.5h)</td></tr>
<tr><td><code>5055.F3[sft]</code></td><td>schinken (~5.6min)</td></tr>
<tr><td><code>5055.F3C[sft]</code></td><td>vergil (~21s)</td></tr>
<tr><td><code>5055.F3C9[sft]</code></td><td>tick (~1.3s)</td></tr>
</tbody>
</table>
</section>
<section>
<h2>Conversion</h2>
<p>To convert a <code>sfttime</code> timestamp to Unix time:</p>
<pre><code>unix = hex_to_decimal(sfttime) * 86400 + 49020</code></pre>
<p>To convert Unix time to <code>sfttime</code>:</p>
<pre><code>sfttime = decimal_to_hex((unix - 49020) / 86400)</code></pre>
</section>
<section>
<h2>Tidbits</h2>
<p>The name ‘<code>sft</code>’ is the clan name of a group of friends from Munich, Bavaria.</p>
</section>
<section>
<h2>See Also</h2>
<p><a href="https://man7.org/linux/man-pages/man1/date.1.html"><code>date(1)</code></a></p>
<dl class="seealso">
<dt>Coordinated Universal Time (UTC)</dt>
<dd><a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">https://en.wikipedia.org/wiki/Coordinated_Universal_Time</a></dd>
<dt>dot-time — a universal convention for conveying time</dt>
<dd><a href="https://dotti.me/">https://dotti.me/</a></dd>
</dl>
</section>
<section>
<h2>History</h2>
<p><code>sfttime</code> was created in <code>3BBE.81[sft]</code> (approximately 2013).</p>
</section>
<footer class="manfooter">
<span></span>
<span class="manfooter-center">April 23, 2026</span>
<span>SFTTIME(7)</span>
</footer>
</body>
</html>
|