Coverage for /usr/lib/python3/dist-packages/fontTools/misc/timeTools.py: 41%
32 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1"""fontTools.misc.timeTools.py -- tools for working with OpenType timestamps.
2"""
4import os
5import time
6from datetime import datetime, timezone
7import calendar
10epoch_diff = calendar.timegm((1904, 1, 1, 0, 0, 0, 0, 0, 0))
12DAYNAMES = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
13MONTHNAMES = [
14 None,
15 "Jan",
16 "Feb",
17 "Mar",
18 "Apr",
19 "May",
20 "Jun",
21 "Jul",
22 "Aug",
23 "Sep",
24 "Oct",
25 "Nov",
26 "Dec",
27]
30def asctime(t=None):
31 """
32 Convert a tuple or struct_time representing a time as returned by gmtime()
33 or localtime() to a 24-character string of the following form:
35 >>> asctime(time.gmtime(0))
36 'Thu Jan 1 00:00:00 1970'
38 If t is not provided, the current time as returned by localtime() is used.
39 Locale information is not used by asctime().
41 This is meant to normalise the output of the built-in time.asctime() across
42 different platforms and Python versions.
43 In Python 3.x, the day of the month is right-justified, whereas on Windows
44 Python 2.7 it is padded with zeros.
46 See https://github.com/fonttools/fonttools/issues/455
47 """
48 if t is None:
49 t = time.localtime()
50 s = "%s %s %2s %s" % (
51 DAYNAMES[t.tm_wday],
52 MONTHNAMES[t.tm_mon],
53 t.tm_mday,
54 time.strftime("%H:%M:%S %Y", t),
55 )
56 return s
59def timestampToString(value):
60 return asctime(time.gmtime(max(0, value + epoch_diff)))
63def timestampFromString(value):
64 wkday, mnth = value[:7].split()
65 t = datetime.strptime(value[7:], " %d %H:%M:%S %Y")
66 t = t.replace(month=MONTHNAMES.index(mnth), tzinfo=timezone.utc)
67 wkday_idx = DAYNAMES.index(wkday)
68 assert t.weekday() == wkday_idx, '"' + value + '" has inconsistent weekday'
69 return int(t.timestamp()) - epoch_diff
72def timestampNow():
73 # https://reproducible-builds.org/specs/source-date-epoch/
74 source_date_epoch = os.environ.get("SOURCE_DATE_EPOCH")
75 if source_date_epoch is not None:
76 return int(source_date_epoch) - epoch_diff
77 return int(time.time() - epoch_diff)
80def timestampSinceEpoch(value):
81 return int(value - epoch_diff)
84if __name__ == "__main__":
85 import sys
86 import doctest
88 sys.exit(doctest.testmod().failed)