Some simple techniques for working with dates.
Addition and subtraction on dates are conveniently performed as IDN numbers. The root functions DateToIDN and IDNToDate are fast and handy:
-/DateToIDN¨(1954 7 5)(1952 9 15) ⍝ days between my and my sister's births 658
But we'll get tired of seeing them everywhere. So let's have an operator.
asIDN←{IDNToDate ⍺ ⍺⍺ DateToIDN ⍵} 7 -⍨ asIDN 1954 7 5 ⍝ 1 week before my sister's birthday 1954 6 28 0
Scalars are often more convenient than triples. We can use ⊥ and ⊤ to switch representations.
100⊥1954 7 5 19540705 0 100 100⊤19540705 1954 7 5 (100⊥⍣¯1)19540705 1954 7 5 dual←{⍺(⍺⍺⍣¯1)⍵⍵ ⍺ ⍺⍺ ⍵} 0 100 100⊤dual {⎕←⍵} 19540705 ⍝ display before recoding 1954 7 5 19540705 0 100 100⊤dual {⎕←⍵} 19540705 19520915 ⍝ my and my sister's birthdates 1954 1952 7 9 5 15 19540705 19520915 0 100 100⊤dual {⎕←⍵} 20070714 19520915 ⍝ today and my birthdate 2007 1952 7 9 14 15 20070714 19520915 0 10000⊤dual {⎕←⍵} 20070714 19520915 ⍝ split ccyy mmdd instead of ccyy mm dd 2007 1952 714 915 20070714 19520915 0 10000⊤dual {1 1⍉⎕←⍵} 20070714 19520915 ⍝ my birthday this year 2007 1952 714 915 20070915 0 10000⊤dual {1 1⍉⎕←⍵} 20071014 19520915 ⍝ but perhaps already passed 2007 1952 1014 915 20070915 0 10000⊤dual {(2↑2⊃>/⍵)+1 1⍉⎕←⍵} 20071014 19520915 ⍝ my next birthday 2007 1952 1014 915 20080915 nextbirthday←{0 10000⊤dual {(2↑2⊃>/⍵)+1 1⍉⍵} ⍺ ⍵} ⍝ as a dyadic fn 20070714 nextbirthday¨19520915 19540705 ⍝ my and my sister's next birthdays 20070915 20080705 Jo SJT KEI Jesus←0705 0915 1217 1225 ⍝ birth years optional 20070714 nextbirthday¨Jo SJT KEI Jesus 20080705 20070915 20071217 20071225 YMDToIDN←{DateToIDN 0 100 100∘⊤⍵} ⍝ convert ccyymmdd to IDN asIDN←{⊃⍺⍺/YMDToIDN¨⍺ ⍵} ⍝ perform ⍺⍺ on args as IDNs 20070915 -asIDN 20070714 ⍝ days to my next birthday 63 20070714{⍺ -⍨asIDN ⍺ nextbirthday ⍵}1225 ⍝ days to Christmas 164 nb←{⍺+⍳⍵-⍺+1} ⍝ whole numbers between args wkday←{(7|⍵)∊⍳5} ⍝ is arg a weekday? 20070714{+/wkday ⍺ nb asIDN ⍺ nextbirthday ⍵}Jesus ⍝ count the weekdays to Christmas 116