| """fontTools.misc.timeTools.py -- tools for working with OpenType timestamps. |
| """ |
| |
| import os |
| import time |
| from datetime import datetime, timezone |
| 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): |
| wkday, mnth = value[:7].split() |
| t = datetime.strptime(value[7:], ' %d %H:%M:%S %Y') |
| t = t.replace(month=MONTHNAMES.index(mnth), tzinfo=timezone.utc) |
| wkday_idx = DAYNAMES.index(wkday) |
| assert t.weekday() == wkday_idx, '"' + value + '" has inconsistent weekday' |
| return int(t.timestamp()) - 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) |