用javascript计算朱利安日期

时间:2018-04-07 03:05:50

标签: javascript date time julian julian-date

我正在尝试使用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.htmhttps://www.aavso.org/jd-calculator

等在线转换器时

输入日期2018-04-08 2:45:16(我的日期转换为UTC),均返回 2458216.61477 。与我的结果相差0.36。

错误在哪里?在我的代码或计算方法中?

2 个答案:

答案 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;
&#13;
&#13;

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