(Arne Babenhauserheide)
2015-06-22: added sexagesimal yeardays, compatible with Tantek. added sexagesimal yeardays, compatible with Tantek.
diff --git a/examples/newbase60.w b/examples/newbase60.w
--- a/examples/newbase60.w
+++ b/examples/newbase60.w
@@ -60,6 +60,38 @@ define : sxg->integer str
- : positive-sxg->integer : string-drop str 1
positive-sxg->integer str
+define : date->sxgepochdays year month day hour minute second
+ let
+ : tm : gmtime 0 ; initialize
+ set-tm:year tm : - year 1900
+ set-tm:mon tm month
+ set-tm:mday tm day
+ set-tm:hour tm hour
+ set-tm:min tm minute
+ set-tm:sec tm second
+ let*
+ : epochseconds : car : mktime tm "+0" ; 0: UTC
+ epochdays : quotient epochseconds : * 24 60 60
+ integer->sxg epochdays
+
+define : yeardays->sxgepochdays year yeardays
+ let
+ : tm : car : strptime "%Y %j" : string-join : map number->string : list year yeardays
+ let*
+ : epochseconds : car : mktime tm "+0" ; 0: UTC
+ epochdays : quotient epochseconds : * 24 60 60
+ integer->sxg epochdays
+
+define : sxgepochdays->yearday str
+ . "Turn sexagesimal days since epoch into year (YYYY) and day of year (DDD)."
+ let*
+ : epochdays : sxg->integer str
+ epochseconds : * epochdays 24 60 60
+ tm : gmtime epochseconds
+ year : + 1900 : tm:year tm
+ yeardays : tm:yday tm
+ list year (+ yeardays 1)
+
define : date->sxg year month day hour minute second
. "Convert a date into new base 60 format:
yyyymmdd hhmmss -> YYMD-hms (can extend till 3599)
@@ -97,11 +129,17 @@ define : main args
help
: and (= 8 (length args)) : equal? "--datetime" : list-ref args 1
format #t "~A\n" : apply date->sxg : map string->number : drop args 2
+ : and (= 8 (length args)) : equal? "--sxgepochdays" : list-ref args 1
+ format #t "~A\n" : apply date->sxgepochdays : map string->number : drop args 2
+ : and (= 4 (length args)) : equal? "--sxgepochdays-from-yearday" : list-ref args 1
+ format #t "~A\n" : apply yeardays->sxgepochdays : map string->number : drop args 2
: and (= 2 (length args)) : equal? "--datetime" : list-ref args 1
let : : tm : localtime : current-time
format #t "~A\n" : apply date->sxg : list (+ 1900 (tm:year tm)) (+ 1 (tm:mon tm)) (tm:mday tm) (tm:hour tm) (tm:min tm) (tm:sec tm)
: and (= 3 (length args)) : equal? "--decode-datetime" : list-ref args 1
format #t "~A\n" : sxg->date : list-ref args 2
+ : and (= 3 (length args)) : equal? "--decode-sxgepochdays" : list-ref args 1
+ format #t "~A\n" : sxgepochdays->yearday : list-ref args 2
: and (= 3 (length args)) : equal? "-d" : list-ref args 1
format #t "~A\n" : sxg->integer : list-ref args 2
: = 2 : length args