APL代码通过格里高利规则将解包日期转换为日计数

时间:2017-09-20 05:35:29

标签: apl

我对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代码解决方案。

2 个答案:

答案 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