我正在尝试使用javascript从日历日期字符串计算Julian日期。我发现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);
对于2018-04-07 23:45:16 -0300的日期,返回 2458216.9802685184 。但是,当我尝试使用http://www.onlineconversion.com/julian_date.htm和https://www.aavso.org/jd-calculator
等在线转换器时输入日期2018-04-08 2:45:16(我的日期转换为UTC),均返回 2458216.61477 。与我的结果相差0.36。
错误在哪里?在我的代码或计算方法中?
答案 0 :(得分:1)
根据StackOverflow问题here,我修改了您的JsFiddle
我已根据
更改了您的实施2440587.5天+ UNIX时间天数===朱利安日
(UNIX TIME / 86400000)+ 2440587.5)===朱利安日;
并更新了您的代码以反映为var JD = time/86400000 + 2440587.5;
要获得与在线计算器相同的结果,我必须使用您在在线示例中使用的UTC时间。
答案 1 :(得分:-1)
正如您在对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
&#13;
创建日期时,我使用了严格的ISO 8601扩展格式。其他任何东西都不应该使用内置的解析器。