"""fontTools.misc.timeTools.py -- tools for working with OpenType timestamps. """ from fontTools.misc.py23 import * import os import time import calendar epoch_diff = calendar.timegm((1904, 1, 1, 0, 0, 0, 0, 0, 0)) DAYNAMES = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] MONTHNAMES = [None, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] def asctime(t=None): """ Convert a tuple or struct_time representing a time as returned by gmtime() or localtime() to a 24-character string of the following form: >>> asctime(time.gmtime(0)) 'Thu Jan 1 00:00:00 1970' If t is not provided, the current time as returned by localtime() is used. Locale information is not used by asctime(). This is meant to normalise the output of the built-in time.asctime() across different platforms and Python versions. In Python 3.x, the day of the month is right-justified, whereas on Windows Python 2.7 it is padded with zeros. See https://github.com/fonttools/fonttools/issues/455 """ if t is None: t = time.localtime() s = "%s %s %2s %s" % ( DAYNAMES[t.tm_wday], MONTHNAMES[t.tm_mon], t.tm_mday, time.strftime("%H:%M:%S %Y", t)) return s def timestampToString(value): return asctime(time.gmtime(max(0, value + epoch_diff))) def timestampFromString(value): return calendar.timegm(time.strptime(value)) - epoch_diff def timestampNow(): # https://reproducible-builds.org/specs/source-date-epoch/ source_date_epoch = os.environ.get("SOURCE_DATE_EPOCH") if source_date_epoch is not None: return int(source_date_epoch) - epoch_diff return int(time.time() - epoch_diff) def timestampSinceEpoch(value): return int(value - epoch_diff) if __name__ == "__main__": import sys import doctest sys.exit(doctest.testmod().failed)