You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
"""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)
 |