我对APL代码感兴趣,使用格里高利历法规则将打包日期打包为整数天计数。
我在大约一个月前问了一个问题,要求APL代码打包一个日期,以便计算日期之间的天数(Convert date to day count)。这很好用,现在我想以这种方式存储日期;但是,这意味着我需要打开它们。
我已经尝试过,但逻辑变得一团糟,我觉得我错过了标记......有些边缘情况会失败。
假设解包功能是Y,我希望看到:
Y¨ 1 365 730 1095 736591
1 1 1 1 12 31 2 12 31 3 12 31 2017 9 19
在某些版本中可能有库/内在支持来帮助解决这个问题,但我正在寻找纯APL代码解决方案。
答案 0 :(得分:2)
您没有提到您正在使用哪种口译员,因此您可能需要将其翻译成您的方言。以下内容摘自Dyalog的dfsn-workspace。
date←{⎕ML←1 ⍝ ⎕TS format from day number (Meeus).
⍺←¯53799 ⍝ start of Gregorian calendar (GB).
qr←{⊂⍤¯1⊢(0,⍺)⊤⍵} ⍝ quotient and remainder.
Z F←1 qr ⍵+2415020 ⍝
a←⌊(Z-1867216.25)÷36524.25 ⍝
A←Z+(Z≥⍺+2415021)×1+a-⌊a÷4 ⍝
B←A+1524 ⍝
C←⌊(B-122.1)÷365.25 ⍝
D←⌊C×365.25 ⍝
E←⌊(B-D)÷30.6001 ⍝
dd df←1 qr(B-D)+F-⌊30.6001×E ⍝
mm←E-1+12×E≥14 ⍝
yyyy←C-6614+mm>2 ⍝
part←60 60 1000 qr⌊0.5+df×86400000 ⍝
↑[⎕IO-0.5]yyyy mm dd,part ⍝
}
date¨1 365 730 1095 736591
┌─────────────┬───────────────┬───────────────┬───────────────┬─────────────────┐
│1 1 1 0 0 0 0│1 12 31 0 0 0 0│2 12 31 0 0 0 0│3 12 31 0 0 0 0│2017 9 19 0 0 0 0│
└─────────────┴───────────────┴───────────────┴───────────────┴─────────────────┘
答案 1 :(得分:1)
∇r←Y b;d;m
[1] r←r++⌿36584 73108 109632∘.≤r←146097|b←365+b
[2] r←366|r++⌿425 790 1155∘.≤r←1461|r
[3] m←+/r∘.≥d←0 31 60 91 121 152 182 213 244 305 335
[4] r←(⌊0.5+(b-r)÷365.2425),m,(r-d[m-~⎕IO])∘.+,1
这是一个带输出的示例运行(我今天使用的年月日):
Y 736592
2017 9 20