时间戳,是一类以 1970年1月1日 为起点(epoch)的,按秒、毫秒或天为单位计数的整数或小数,本质上是时间差值。
食用指南
- 当需要使用字符串存储时间戳时,下表的 指数 代表了存储对应时长所需的字符个数,底数 对应了字符串中整数的进位制。
- 当需要将时间戳嵌入整数时,以 2 为底的数的指数代表了存储对应时长所需的比特数,以 10 为底的数的指数代表了整数转化为字符串时的字符个数。
注意事项
- 表中时间差均不包含闰日和闰秒;一年按 365 天计。
- 下表只提供了底数的整数次幂,如果使用 有符号整数 等类型来存储,实际存储时长要在对应上限减去 1 单位时间差。比如16位有符号整数存储日戳,最大只能存储 215 - 1 = 89 年 282 天。
- 时间戳本质上是两个时刻之间的差值,因此务必将 当时 与 起点 设为同一个时区的时间。
秒戳
以秒为单位的时间戳,一般是整数或小数。
时间差 | GMT+0 时刻 | |||||||
---|---|---|---|---|---|---|---|---|
242 | 814 | 647 | 13,9461 年 51 天 02:25:04 | - | ||||
627 | 11,1669 年 243 天 07:30:08 | - | ||||||
368 | 8,9456 年 295 天 00:57:36 | - | ||||||
241 | 6,9730 年 208 天 01:12:32 | - | ||||||
240 | 1610 | 3,4865 年 104 天 00:36:16 | - | |||||
1012 | 3,1709 年 289 天 01:46:40 | - | ||||||
239 | 813 | 1,7432 年 234 天 12:18:08 | - | |||||
238 | 8716 年 117 天 06:09:04 | - | ||||||
237 | 4358 年 58 天 15:04:32 | 6325-04-08 15:04:32 | ||||||
1011 | 3170 年 357 天 09:46:40 | 5138-11-16 09:46:40 | ||||||
367 | 2484 年 332 天 15:21:36 | 4453-04-05 15:21:36 | ||||||
236 | 812 | 169 | 646 | 2179 年 29 天 07:32:16 | 4147-08-20 07:32:16 | |||
626 | 1801 年 45 天 03:13:04 | 3769-12-05 03:13:04 | ||||||
235 | 1089 年 197 天 03:46:08 | 3058-10-26 03:46:08 | ||||||
234 | 544 年 281 天 01:53:04 | 2514-05-30 01:53:04 | ||||||
1010 | 317 年 35 天 17:46:40 | 2286-11-20 17:46:40 | ||||||
233 | 811 | 272 年 140 天 12:56:32 | 2242-03-16 12:56:32 | |||||
232 | 168 | 136 年 70 天 06:28:16 | 2106-02-07 06:28:16 | |||||
366 | 69 年 9 天 05:45:36 | 2038-12-24 05:45:36 | ||||||
231 | 68 年 35 天 03:14:08 | 2038-01-19 03:14:08 | ||||||
230 | 810 | 645 | 34 年 17 天 13:37:04 | 2004-01-10 13:37:04 | ||||
109 | 31 年 259 天 01:46:40 | 2001-09-09 01:46:40 | ||||||
625 | 29 年 18 天 09:20:32 | 1999-01-12 09:20:32 | ||||||
229 | 17 年 8 天 18:48:32 | 1987-01-05 18:48:32 | ||||||
228 | 167 | 8 年 186 天 21:24:16 | 1978-07-04 21:24:16 | |||||
227 | 89 | 4 年 93 天 10:42:08 | 1974-04-03 10:42:08 | |||||
108 | 3 年 62 天 09:46:40 | 1973-03-03 09:46:40 | ||||||
226 | 2 年 46 天 17:21:04 | 1972-02-16 17:21:04 | ||||||
365 | 1 年 334 天 20:09:36 | 1971-12-01 20:09:36 | ||||||
225 | 1 年 23 天 08:40:32 | 1971-01-24 08:40:32 | ||||||
224 | 88 | 166 | 644 | 194 天 04:20:16 | 1970-07-14 04:20:16 | |||
624 | 171 天 00:32:16 | 1970-06-21 00:32:16 | ||||||
107 | 115 天 17:46:40 | 1970-04-26 17:46:40 | ||||||
223 | 97 天 02:10:08 | 1970-04-08 02:10:08 | ||||||
222 | 48 天 13:05:04 | 1970-02-18 13:05:04 | ||||||
221 | 87 | 24 天 06:32:32 | 1970-01-25 06:32:32 | |||||
364 | 19 天 10:33:36 | 1970-01-20 10:33:36 | ||||||
220 | 165 | 12 天 03:16:16 | 1970-01-13 03:16:16 | |||||
106 | 11 天 13:46:40 | 1970-01-12 13:46:40 | ||||||
219 | 6 天 01:38:08 | 1970-01-07 01:38:08 | ||||||
218 | 86 | 643 | 3 天 00:49:04 | 1970-01-04 00:49:04 | ||||
623 | 2 天 18:12:08 | 1970-01-03 18:12:08 | ||||||
217 | 1 天 12:24:32 | 1970-01-02 12:24:32 | ||||||
105 | 1 天 03:46:40 | 1970-01-02 03:46:40 | ||||||
216 | 164 | 18:12:16 | 1970-01-01 18:12:16 | |||||
363 | 12:57:36 | 1970-01-01 12:57:36 | ||||||
215 | 85 | 09:06:08 | 1970-01-01 09:06:08 | |||||
214 | 04:33:04 | 1970-01-01 04:33:04 | ||||||
104 | 02:46:40 | 1970-01-01 02:46:40 | ||||||
213 | 02:16:32 | 1970-01-01 02:16:32 | ||||||
212 | 84 | 163 | 642 | 01:08:16 | 1970-01-01 01:08:16 | |||
622 | 01:04:04 | 1970-01-01 01:04:04 | ||||||
211 | 00:34:08 | 1970-01-01 00:34:08 | ||||||
362 | 00:21:36 | 1970-01-01 00:21:36 | ||||||
210 | 00:17:04 | 1970-01-01 00:17:04 | ||||||
103 | 00:16:40 | 1970-01-01 00:16:40 | ||||||
29 | 83 | 00:08:32 | 1970-01-01 00:08:32 | |||||
28 | 162 | 00:04:16 | 1970-01-01 00:04:16 | |||||
27 | 00:02:08 | 1970-01-01 00:02:08 | ||||||
102 | 00:01:40 | 1970-01-01 00:01:40 | ||||||
26 | 82 | 641 | 00:01:04 | 1970-01-01 00:01:04 | ||||
621 | 00:01:02 | 1970-01-01 00:01:02 |
毫秒戳
以毫秒为单位的时间戳,一般是整数。
时间差 | GMT+0 时刻 | |||||||
---|---|---|---|---|---|---|---|---|
629 | 42,9258 年 72 天 10:24:23.552 | - | ||||||
1016 | 31,7097 年 335 天 17:46:40.000 | - | ||||||
253 | 28,5616 年 151 天 08:59:00.992 | - | ||||||
252 | 1613 | 14,2808 年 75 天 16:29:30.496 | - | |||||
3610 | 11,5936 年 8 天 14:41:02.976 | - | ||||||
251 | 817 | 7,1404 年 37 天 20:14:45.248 | - | |||||
250 | 3,5702 年 18 天 22:07:22.624 | - | ||||||
1015 | 3,1709 年 289 天 01:46:40.000 | - | ||||||
249 | 1,7851 年 9 天 11:03:41.312 | - | ||||||
248 | 816 | 1612 | 648 | 8925 年 187 天 05:31:50.656 | - | |||
628 | 6923 年 189 天 13:19:44.896 | 8888-12-02 13:19:44.896 | ||||||
247 | 4462 年 276 天 02:45:55.328 | 6429-10-17 02:45:55.328 | ||||||
369 | 3220 年 162 天 11:04:28.416 | 5188-04-22 11:04:28.416 | ||||||
1014 | 3170 年 357 天 09:46:40.000 | 5138-11-16 09:46:40 | ||||||
246 | 2231 年 138 天 01:22:57.664 | 4199-11-24 01:22:57.664 | ||||||
245 | 815 | 1115 年 251 天 12:41:28.832 | 3084-12-12 12:41:28.832 | |||||
244 | 1611 | 557 年 308 天 06:20:44.416 | 2527-06-23 06:20:44.416 | |||||
1013 | 317 年 35 天 17:46:40.000 | 2286-11-20 17:46:40 | ||||||
243 | 278 年 336 天 15:10:22.208 | 2248-09-26 15:10:22.208 | ||||||
242 | 814 | 647 | 139 年 168 天 07:35:11.104 | 2109-05-15 07:35:11.104 | ||||
627 | 111 年 244 天 10:16:46.208 | 2081-08-05 10:16:46.208 | ||||||
368 | 89 年 166 天 17:38:27.456 | 2059-05-25 17:38:27.456 | ||||||
241 | 69 年 266 天 15:47:35.552 | 2039-09-07 15:47:35.552 | ||||||
240 | 1610 | 34 年 315 天 19:53:47.776 | 2004-11-03 19:53:47.776 | |||||
1012 | 31 年 259 天 01:46:40.000 | 2001-09-09 01:46:40 | ||||||
239 | 813 | 17 年 157 天 21:56:53.888 | 1987-06-03 21:56:53.888 | |||||
238 | 8 年 261 天 10:58:26.944 | 1978-09-17 10:58:26.944 | ||||||
237 | 4 年 130 天 17:29:13.472 | 1974-05-10 17:29:13.472 | ||||||
1011 | 3 年 62 天 09:46:40.000 | 1973-03-03 09:46:40 | ||||||
367 | 2 年 176 天 23:49:24.096 | 1972-06-25 23:49:24.096 | ||||||
236 | 812 | 169 | 646 | 2 年 65 天 08:44:36.736 | 1972-03-06 08:44:36.736 | |||
626 | 1 年 292 天 09:50:35.584 | 1971-10-20 09:50:35.584 | ||||||
235 | 1 年 32 天 16:22:18.368 | 1971-02-02 16:22:18.368 | ||||||
234 | 198 天 20:11:09.184 | 1970-07-18 20:11:09.184 | ||||||
1010 | 115 天 17:46:40.000 | 1970-04-26 17:46:40 | ||||||
233 | 811 | 99 天 10:05:34.592 | 1970-04-10 10:05:34.592 | |||||
232 | 168 | 49 天 17:02:47.296 | 1970-02-19 17:02:47.296 | |||||
366 | 25 天 04:39:42.336 | 1970-01-26 04:39:42.336 | ||||||
231 | 24 天 20:31:23.648 | 1970-01-25 20:31:23.648 | ||||||
230 | 810 | 645 | 12 天 10:15:41.824 | 1970-01-13 10:15:41.824 | ||||
109 | 11 天 13:46:40.000 | 1970-01-12 13:46:40 | ||||||
625 | 10 天 14:28:52.832 | 1970-01-11 14:28:52.832 | ||||||
229 | 6 天 05:07:50.912 | 1970-01-07 05:07:50.912 | ||||||
228 | 167 | 3 天 02:33:55.456 | 1970-01-04 02:33:55.456 | |||||
227 | 89 | 1 天 13:16:57.728 | 1970-01-02 13:16:57.728 | |||||
108 | 1 天 03:46:40.000 | 1970-01-02 03:46:40 | ||||||
226 | 18:38:28.864 | 1970-01-01 18:38:28.864 | ||||||
365 | 16:47:46.176 | 1970-01-01 16:47:46.176 | ||||||
225 | 09:19:14.432 | 1970-01-01 09:19:14.432 | ||||||
224 | 88 | 166 | 644 | 04:39:37.216 | 1970-01-01 04:39:37.216 | |||
624 | 04:06:16.336 | 1970-01-01 04:06:16.336 | ||||||
107 | 02:46:40.000 | 1970-01-01 02:46:40 | ||||||
223 | 02:19:48.608 | 1970-01-01 02:19:48.608 | ||||||
222 | 01:09:54.304 | 1970-01-01 01:09:54.304 | ||||||
221 | 87 | 00:34:57.152 | 1970-01-01 00:34:57.152 | |||||
364 | 00:27:59.616 | 1970-01-01 00:27:59.616 | ||||||
220 | 165 | 00:17:28.576 | 1970-01-01 00:17:28.576 | |||||
106 | 00:16:40.000 | 1970-01-01 00:16:40 | ||||||
219 | 00:08:44.288 | 1970-01-01 00:08:44.288 | ||||||
218 | 86 | 643 | 00:04:22.144 | 1970-01-01 00:04:22.144 | ||||
623 | 00:03:58.328 | 1970-01-01 00:03:58.328 | ||||||
217 | 00:02:11.072 | 1970-01-01 00:02:11.072 | ||||||
105 | 00:01:40.000 | 1970-01-01 00:01:40 | ||||||
216 | 164 | 00:01:05.536 | 1970-01-01 00:01:05.536 | |||||
363 | 00:00:46.656 | 1970-01-01 00:00:46.656 | ||||||
215 | 85 | 00:00:32.768 | 1970-01-01 00:00:32.768 | |||||
214 | 00:00:16.384 | 1970-01-01 00:00:16.384 | ||||||
104 | 00:00:10.000 | 1970-01-01 00:00:10 | ||||||
213 | 00:00:08.192 | 1970-01-01 00:00:08.192 | ||||||
212 | 84 | 163 | 642 | 00:00:04.096 | 1970-01-01 00:00:04.096 | |||
622 | 00:00:03.844 | 1970-01-01 00:00:03.844 | ||||||
211 | 00:00:02.048 | 1970-01-01 00:00:02.048 | ||||||
362 | 00:00:01.296 | 1970-01-01 00:00:01.296 | ||||||
210 | 00:00:01.024 | 1970-01-01 00:00:01.024 |
日戳
以天为单位的时间戳,一般是整数。
时间差 | GMT+0 时刻 | |||||||
---|---|---|---|---|---|---|---|---|
365 | 16,5660 年 276 天 | - | ||||||
225 | 9,1929 年 347 天 | - | ||||||
224 | 88 | 166 | 644 | 4,5964 年 356 天 | - | |||
624 | 4,0483 年 41 天 | - | ||||||
107 | 2,7397 年 95 天 | - | ||||||
223 | 2,2982 年 178 天 | - | ||||||
222 | 1,1491 年 89 天 | - | ||||||
221 | 87 | 5745 年 227 天 | 7711-10-23 | |||||
364 | 4601 年 251 天 | 6568-08-19 | ||||||
220 | 165 | 2872 年 296 天 | 4840-11-26 | |||||
106 | 2739 年 265 天 | 4707-11-29 | ||||||
219 | 1436 年 148 天 | 3405-06-15 | ||||||
218 | 86 | 643 | 718 年 74 天 | 2687-09-23 | ||||
623 | 652 年 348 天 | 2622-07-10 | ||||||
217 | 359 年 37 天 | 2328-11-12 | ||||||
105 | 273 年 355 天 | 2243-10-17 | ||||||
216 | 164 | 179 年 201 天 | 2149-06-07 | |||||
363 | 127 年 301 天 | 2097-09-27 | ||||||
215 | 85 | 89 年 283 天 | 2059-09-19 | |||||
214 | 44 年 324 天 | 2014-11-10 | ||||||
104 | 27 年 145 天 | 1997-05-19 | ||||||
213 | 22 年 162 天 | 1992-06-06 | ||||||
212 | 84 | 163 | 642 | 11 年 81 天 | 1981-03-20 | |||
622 | 10 年 194 天 | 1980-07-11 | ||||||
211 | 5 年 223 天 | 1975-08-11 | ||||||
362 | 3 年 201 天 | 1973-07-20 | ||||||
210 | 2 年 294 天 | 1972-10-21 | ||||||
103 | 2 年 270 天 | 1972-09-27 | ||||||
29 | 83 | 1 年 147 天 | 1971-05-28 | |||||
28 | 162 | 256 天 | 1970-09-14 | |||||
27 | 128 天 | 1970-05-09 | ||||||
102 | 100 天 | 1970-04-11 | ||||||
26 | 82 | 641 | 64 天 | 1970-03-06 | ||||
621 | 62 天 | 1970-03-04 | ||||||
361 | 36 天 | 1970-02-06 | ||||||
25 | 32 天 | 1970-02-02 | ||||||
24 | 161 | 16 天 | 1970-01-17 | |||||
101 | 10 天 | 1970-01-11 | ||||||
23 | 81 | 8 天 | 1970-01-09 | |||||
22 | 4 天 | 1970-01-05 | ||||||
21 | 2 天 | 1970-01-03 | ||||||
20 | 80 | 100 | 160 | 360 | 620 | 640 | 1 天 | 1970-01-02 |
生成代码
#!/usr/bin/python3.11
from __future__ import annotations
import math
from datetime import datetime, timedelta
from itertools import chain
def is_integer(number: int | float) -> bool:
n = round(number, 6)
return int(n) + 0.0 == n
def calc_stamp_time(**kwargs) -> str:
try:
string = str(epoch + timedelta(**kwargs))
except OverflowError:
return '-'
if string.endswith('.000'):
return string[:-1]
elif string.endswith('000'):
return string[:-3]
else:
return string
def separate(number: int, bits=4, separator=',') -> str:
def stream():
counter = 1
for d in str(number)[::-1]:
if counter > bits:
yield separator
counter = 1
yield d
counter += 1
return ''.join(stream())[::-1]
epoch = datetime(1970, 1, 1)
table_d = list()
table_s = list()
table_ms = list()
stamps = chain.from_iterable([
map(lambda power: (1 << power, 2, power), range(64 + 1)),
map(lambda power: (10 ** power, 10, power), range(19 + 1)),
map(lambda power: (36 ** power, 36, power), range(13 + 1)),
map(lambda power: (62 ** power, 62, power), range(11 + 1)),
])
for stamp, base, power in reversed(sorted(stamps)):
# 底数和指数
equal_base64 = is_integer(power64 := math.log(stamp, 64))
equal_base16 = is_integer(power16 := math.log(stamp, 16))
equal_base8 = is_integer(power8 := math.log(stamp, 8))
cols = [
f'2<sup>{power}</sup>' if base == 2 else '',
f'8<sup>{int(power8)}</sup>' if equal_base8 else '',
f'10<sup>{power}</sup>' if base == 10 else '',
f'16<sup>{int(power16)}</sup>' if equal_base16 else '',
f'36<sup>{power}</sup>' if base == 36 else '',
f'62<sup>{power}</sup>' if base == 62 else '',
f'64<sup>{int(power64)}</sup>' if equal_base64 else '',
'<Time Delta>',
'<GMT+0 Time>',
]
# 日戳 --------------------------------
years, days = divmod(stamp, 365)
cols[-1], _, _ = calc_stamp_time(days=stamp).partition(' ')
cols[-2] = f'{separate(years)} 年 {days} 天' if years > 0 else f'{days} 天'
table_d.append('| ' + ' | '.join(cols) + ' |')
# 秒戳 --------------------------------
minutes, seconds = divmod(stamp, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
years, days = divmod(days, 365)
cols[-1] = calc_stamp_time(seconds=stamp)
cols[-2] = (
(f'{separate(years)} 年 {days} 天 ' if years > 0 else f'{days} 天 ' if days > 0 else '')
+ f'{hours:02d}:{minutes:02d}:{seconds:02d}'
)
table_s.append('| ' + ' | '.join(cols) + ' |')
# 毫秒戳 --------------------------------
seconds, milliseconds = divmod(stamp, 1000)
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
years, days = divmod(days, 365)
cols[-1] = calc_stamp_time(milliseconds=stamp)
cols[-2] = (
(f'{separate(years)} 年 {days} 天 ' if years > 0 else f'{days} 天 ' if days > 0 else '')
+ f'{hours:02d}:{minutes:02d}:{seconds:02d}.{milliseconds:03d}'
)
table_ms.append('| ' + ' | '.join(cols) + ' |')
print('\n'.join(table_ms))
print('\n'.join(table_s))
print('\n'.join(table_d))