将 Julian Date(5 或 4 个字符)转换为 Gregorian,反之亦然

Converting Julian Date (5 or 4 character) to Gregorian and vice versa

我正在尝试创建一个 VBA 脚本或 formula/function 将儒略日期(5001 或 15001)转换为常规日期 (01/01/2015)。我能够找到以下公式,将 5 个字符的 Julian Date 转换为 Gregorian Date,并且工作正常。我不是数学家,所以我不确定如何为 4 个字符的 JD 编写公式,我什至不知道从哪里开始反向(常规日期到 JD)。任何有关此事的帮助将不胜感激。

5个字符JD的公式在这里:

Assuming that the Julian Date is in A1:


=DATE(IF(0+(LEFT(A1,2))<30,2000,1900)+LEFT(A1,2),1,RIGHT(A1,3))

在此先感谢您的帮助。

您可以使用 this 页面中的这个公式:

=DATE(IF(0+(LEFT(JULIAN_DATE_CELL,2))<30,2000,1900)+LEFT(JULIAN_DATE_CELL,2),1,RIGHT(JULIAN_DATE_CELL,3))

您需要将 JULIAN_DATE_CELL 替换为您存储儒略日期的单元格编号。

您需要测试目标单元格的长度以确定它是 4 还是 5 个字符长(为清楚起见换行):

=DATE(IF(0+(VALUE(IF(LEN(A1)=5,LEFT(A1,2),LEFT(A1,1))))<30,2000,1900)
      +VALUE(IF(LEN(A1)=5,LEFT(A1,2),LEFT(A1,1))),1,RIGHT(A1,3))

反过来要容易得多 - 只需从日期部分构建一个数字并将生成的字符串转换为数字以去除任何前导零:

=VALUE(RIGHT(YEAR(A1),2)&TEXT(A1-DATE(YEAR(A1),1,0),"000"))

编辑: 根据评论,如果 4 年 Julian 日期的第一位数字小于或等于当前日期的最后一位数字,则以下方法将使用当前十年年,否则使用 200x:

=DATE(IF(0+(VALUE(IF(LEN(A1)=5,LEFT(A1,2),LEFT(A1,1))))<30,
      IF(LEN(A1)=5,2000,IF(LEFT(A1,1)<=RIGHT(YEAR(NOW()),1),2010, 2000)),1900)
      +VALUE(IF(LEN(A1)=5,LEFT(A1,2),LEFT(A1,1))),1,RIGHT(A1,3))

差点忘了...如果您需要公式在 2019 年后仍然有效,您可以将 2010 替换为 2000+(MID(YEAR(NOW()),3,1)*10)

您需要适应 2000 年之前的日期吗?如果没有,那么您可以使用此公式:

=DATE(IF(LEN(A1)=5,LEFT(A1,2)+100,LOOKUP(YEAR(NOW()),FLOOR(YEAR(NOW()),10)+LEFT(A1)-{10,0})),1,RIGHT(A1,3))

使用 LOOKUP 函数根据可能的选项查找当前年份,例如目前,如果您在 A1 中有 6001,它会根据 {2006,2016} 之类的数组查找 2015 年,并选择较低的值。如果你明年做同样的计算,将选择2016

此公式将适用于未来,例如在 2020 年,它将 9001 解释为 2019 年 1 月 1 日。

为了逆向计算,你总是想要一个 4 位数的 JD,那么 2010 或 2020 呢?