使用 javascript 计算儒略日期

Calculating julian date with javascript

我正在尝试使用 javascript 从日历日期字符串计算儒略日期。我发现 this site 解释了如何计算它。

我制作了这个 javascript 代码:https://jsfiddle.net/kzgn8vs1/1/

var time = moment("2018-04-07 23:45:16 -0300", "YYYY-MM-DD HH:mm:ss Z").utc(); 
var Y = time.year();
var M = time.month() + 1;
var D = time.date() + moment.duration(time.format('HH:mm:ss')).asDays();

if( M == 1 || M == 2 ) {
    Y = Y - 1;
    M = M + 12;
}

var A = Y / 100;
var B = 2 - A + (A / 4);
var C = ( Y > 0 ) ? (365.25 * Y) : ((365.25 * Y) - 0.75);
var E = 30.6001 * (M + 1);

var JD = B+C+D+E+1720994.5;

console.log(JD);

其中 returns 2458216.9802685184 日期为 2018-04-07 23:45:16 -0300。但是当我尝试一些像 http://www.onlineconversion.com/julian_date.htm and https://www.aavso.org/jd-calculator

这样的在线转换器时

输入日期 2018-04-08 2:45:16(我的日期转换为 UTC),两者都是 return 2458216.61477。与我的结果相差 0.36。

哪里出错了?在我的代码中还是在计算方法中?

基于 Whosebug 问题 here, I have modified your JsFiddle

我已经根据

更改了你的实现

2440587.5 days + UNIX TIME in days === Julian Day

(UNIX TIME / 86400000) + 2440587.5) === Julian Day;

并已更新您的代码以反映 var JD = time/86400000 + 2440587.5; 为了获得与在线计算器相同的结果,我不得不使用您在在线示例中使用的 UTC 时间。

正如您在对 Lasitha Ishan Petthawadu 的回答的评论中所说,您需要降低 A、B、C 和 E 的值。一个版本是算法 linked from the OP 的非常直接的实现,无需使用库是:

function toJulianDate(date) {
  var floor = Math.floor;
  var y = date.getUTCFullYear();
  var m = date.getUTCMonth() + 1;
  var d = date.getUTCDate() + (date % 8.64e7) / 8.64e7;
  
  if (m < 3) {
    y -= 1;
    m += 12;
  }
  
  var a = floor(y/100);
  var b = date < new Date(Date.UTC(1582,9,15))? 0 : 2 - a + floor(a/4);
  var c = floor(y < 0? 365.25 * y - 0.75 : 365.25 * y);
  var e = floor(30.6001 * (m + 1));
  
  return b + c + d + e + 1720994.5;
}

console.log(toJulianDate(new Date('2018-04-07T23:45:16-03:00'))); // 2458216.6147685186

console.log(toJulianDate(new Date('2018-04-08T02:45:16Z'))); // 2458216.6147685186

创建日期时,我使用了严格的 ISO 8601 扩展格式。其他任何东西都不应该使用 built-in 解析器。

如果你只需要公历日期,可以取这个函数:

function jdFromDate(dateTime) {
    return (
        Date.UTC(
            dateTime.getFullYear(),
            dateTime.getMonth(),
            dateTime.getDate()
        ) /
            86400000 +
        2440588
    );
}

至于公历与儒略历的讨论,这比许多人想象的要复杂得多。一些国家很晚才采用公历(例如英国,苏格兰除外,1752 年除外),因此比较 1582 年和 1918 年(俄罗斯采用公历)之间的历史日期是一项艰巨的任务,具体取决于您的用例。如果您只是想将日期存储为 JD 以使其在不同平台上可用(例如,简单地显示它们),无论如何使用不同的日历可能太多了。我与早期现代资料来源进行了广泛的合作,很难掌握哪个来源说明了哪个日历系统中的日期(还要注意,1 月 1 日可能不是当时每个地区一年中的第一天...... ).有关该主题的更多信息,您可能想看看 Nachum Dershowitz 和 Edward Reingold 的“Calendrical Calculations”——它们涵盖的内容远不止这两个日历系统,不过 :-)