ref: 15606f51c9d822f324ac97f3fc174a4e79414f00
dir: /lib/date/date.myr/
use std pkg date = type date = struct actual : std.time /* epoch time in microseconds */ tzoff : diff /* timezone offset in microseconds */ year : int /* year, starting at 0 (ie, 1 BCE) */ mon : int /* month, [1..12] */ day : int /* day, [1..31] */ wday : int /* weekday, [0..6] */ h : int /* hour: [0..23] */ m : int /* minute: [0..59] */ s : int /* second: [0..59] */ us : int /* microsecond: [0..999,999] */ ;; type diff = std.time /* date i/o */ const parse : (d : byte[:] -> date) const parsefmt : (fmt : byte[:], d : byte[:] -> date) const parsez : (d : byte[:], tz : byte[:] -> date) const fmt : (d : date -> byte[:]) const bfmt : (d : date, buf : byte[:] -> byte[:]) /* useful constructors */ const mkdate : (tm : std.time, tz : diff -> date) const now : (-> date) const utcnow : (-> date) const localoff : (-> diff) const tzoff : (tzname : byte[:] -> diff) /* date differences */ const add : (d : date, dt : diff -> date) const diff : (a : date, b : date -> diff) ;; const monthbound = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] const leapmonthbound = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ] const Day400y = (365*400 + 24*4 + 1) const Day100y = (365*100 + 24) const Day4y = (365*4 + 1) const now = { -> utcnow() } const utcnow = { var tm tm = std.now() std.put("tm = %l\n", tm) -> mkdate(tm, 0) } const mkdate = {tm, off var j, y, m, d var t, e var date date.actual = tm date.tzoff = off tm += off castto(std.time) t = tm % (24*60*60*1_000_000) /* time */ e = tm / (24*60*60*1_000_000) /* epoch days */ /* microseconds, seconds, minutes, hours */ date.us = (t % 1_000_000) castto(int) t /= 1_000_000 date.s = (t % 60) castto(int) t /= 60 date.m = (t % 60) castto(int) t /= 60 date.h = t castto(int) /* weekday */ date.wday = ((e + 4) % 7) castto(int) /* the world started on Thursday */ /* year, month, day: Implemented according to algorithm 199, conversions between calendar date and Julian day number: Robert G. Tantzen Air Force Missile: Development Center, Holloman AFB, New Mex. Lots of magic. */ j = e + 719468 y = (4 * j - 1) / 146097 j = 4 * j - 1 - 146097 * y d = j / 4 j = (4 * d + 3) / 1461 d = 4 * d + 3 - 1461 * j d = (d + 4) / 4 ; m = (5 * d - 3) / 153 d = 5 * d - 3 - 153 * m d = (d + 5) / 5 y = 100 * y + j if m < 10 m += 3 else m -= 9 y++ ;; date.year = y castto(int) date.mon = m castto(int) date.day = (d + 1) castto(int) -> date } const ndays = {y if y % 4 == 0 && (y % 100 != 0 || y % 400 == 0) -> 366 else -> 365 ;; }