diff --git a/macdate.py b/macdate.py new file mode 100755 index 0000000..9c8e903 --- /dev/null +++ b/macdate.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +import sys +from datetime import datetime, timedelta + + +# Copied from machfs MakeHFS +def hfsdat(x): + if x.lower() == "now": + x = datetime.now().isoformat() + + if len(x) == 8 and all(c in "0123456789ABCDEF" for c in x.upper()): + try: + return int(x, base=16) + except ValueError: + pass + + epoch = "19040101000000" # ISO8601 with the non-numerics stripped + + # strip non-numerics and pad out using the epoch (cheeky) + stripped = "".join(c for c in x if c in "0123456789") + stripped = stripped[: len(epoch)] + epoch[len(stripped) :] + + tformat = "%Y%m%d%H%M%S" + + delta = datetime.strptime(stripped, tformat) - datetime.strptime(epoch, tformat) + delta = int(delta.total_seconds()) + + if not 0 <= delta <= 0xFFFFFFFF: + print("Warning: moving %r into the legacy MacOS date range (1904-2040)" % x) + + delta = min(delta, 0xFFFFFFFF) + delta = max(delta, 0) + + return delta + + +# Copied from ExtractBinDates.py +def macdatestr(srcint): + dt = datetime(1904, 1, 1) + timedelta(seconds=srcint) + st = dt.isoformat() + st = st.replace("T", " ") + return st + + +def secs2date(secs): + print(f"${secs:08x} = {macdatestr(secs)}") + + +def date2secs(date): + secs = hfsdat(date) + print(f"{macdatestr(secs)} = ${secs:08x}") + + +for a in sys.argv[1:]: + if a.startswith("$"): + secs = int(a[1:], 16) + secs2date(secs) + elif a.startswith("0x"): + secs = int(a[2:], 16) + secs2date(secs) + else: + date2secs(a)