在JavaScript中计算Jday(Julian Day)

我有要求计算在JavaScript的jday ,为了做客户端validation,任何一个可以帮助我如何计算JDAY在JavaScript或脚本更改给定的JDAY实际的date,反之亦然。

要知道什么是JDay,我find了以下网站,

http://www.pauahtun.org/Software/jday.1.html

我也指下面的网站进行JAVA中提到的计算

http://www.rgagnon.com/javadetails/java-0506.html

先谢谢你

朱利安日

朱利安是7980年周期开始以来经过的天数。

Joseph Scaliger于1583年发明,该系统的目的是使计算一个日历date和另一个日历date之间的整数整数差异变得容易。

7980年的周期是通过结合几个传统的时间周期(太阳能,月球和一个特定的罗马税收周期)而得出的,其中7980是常见倍数。

第一个朱利安循环的起点始于公元前4713年1月1日格林尼治标准时间中午,格林尼治标准时间中午3268年1月22日,整整7天,正好是7980。

例如,2016年1月1日的Julian日数为2,457,389,这是自当年4713年1月1日以来的天数。

如何计算它

我们知道Unix时间是自1970年1月1日UTC时间00:00:00以来的秒数,不包括闰秒,也称为Epoch,我们可以使用一些math来计算Julian Day,当我们已经有Unix时间。

格林尼治标准时间和世界标准时间在实践中共享相同的时间,所以对此,应该没有区别。

首先,我们需要知道从Julian循环开始到Unix时间戳开始的天数。
换句话说,从公元前4713年1月1日格林威治时间12:00:00到1970年1月1日UTC时间00:00:00的天数。

有这样的天数,从来没有改变,我们可以添加从1970年1月1日到今天,这是Javascript返回的天数来获得Julian Day。

这些年来没有加起来,只是通过searchnetworking,它告诉我们,公元前4713年和公元1970年之间的天数差异是2440588天,​​因为朱利安周期开始于中午,而不是在午夜,我们必须减去半天,就是2440587.5天。

那么我们现在拥有的是2440587.5 days + UNIX TIME in days === Julian Day

用一些简单的math,我们可以知道一天的时间是86,400秒,Unix时间戳是用毫秒,所以UNIX TIME / 86400000会让我们从1970年1月1日星期四到今天的天数。

现在只是一天,我们想要整天的时间,而不是小数,而且可以把它整天关在一起,做一些像

 Math.floor((UNIX TIME / 86400000) + 2440587.5); 

朱利安date

有时在编程中,“Julian Date”意味着从一年开始的天数,例如2016年6月1日将是该年的152天等。

“朱利安date”的正确使用是一个朱利安日,时间戳添加为一天中的一小部分。

以这个答案的顶部为例,2016年1月1日是Julian Day 2,457,389,我们可以增加一些时间。
朱利安节在中午开始,没有2457389.5时间,因此在午夜时分是2457389.5 ,在18:00或中午六点以后,将是2457389.25 ,加上“半天”,“一天的四分之一“等

再次计算它

这意味着0.1 Juliandate与24小时除以10或24 / 10 === 2.4 hours ,换句话说,Julian Day时间戳是小数部分(每天十分之一等)

让我们看看一些JavaScript函数,首先是Date构造函数。

Javascript只能访问它运行的计算机上的本地时间,所以当我们做new Date()它不会创build一个UTCdate,即使UNIX时间是UTC, new Date会给你从纪元直到计算机有当地时间,并且不考虑您的时区。

然而,Javascript确实有Date.UTC ,它将以UTC格式返回date,可以检查差异,这当然会根据您设置本地系统的时区而有所不同。

 var regular_date = new Date(2016, 1, 1, 0, 0, 0); var UTC_date = Date.UTC(2016, 1, 1, 0, 0, 0); var difference = UTC_date - regular_date; document.body.innerHTML = 'The difference between your local time and UTC is ' +(difference/1000)+ ' seconds'; 

new Date().getTime()/86400000 + 2440587.5将获得unix时间戳,将其转换为天,并添加1970-01-01的JD,这是unix时间戳的纪元。

这是天文学家所称的朱利安date。 这是明确的。 由于Unix时间标记和JD都没有考虑闰秒,所以不会降低准确性。 请注意,JD不需要在UTC的时区(但通常是)。 这个答案为您提供时区UTC的JD。

根据维基百科 :

 a = (14 - month) / 12 y = year + 4800 - a m = month + 12a - 3 JDN = day + (153m + 2) / 5 + 365y + y/4 - y/100 + y/400 - 32045 

如果您在实施时遇到了更具体的问题,请在问题中提供这些详细信息,以便我们可以进一步提供帮助。

注:这是不正确的,因为维基的“楼层括号”被遗忘在这里。

正确的公式是:

 a = Int((14 - Month) / 12) y = Year + 4800 - a m = Month + 12 * a - 3 JDN = Day + Int((153 * m + 2) / 5) + 365 * y + Int(y / 4) - Int(y / 100) + Int(y / 400) - 32045 

另外,这里有一个npm包:

朱利安

在date对象和天文学和历史中使用的儒略date之间进行转换

  var julian = require('julian'); var now = new Date(); // Let's say it's Thu, 21 Nov 2013 10:47:02 GMT var jd = ''; console.log(jd = julian(now)); // -> '2456617.949335' console.log(julian.toDate(jd)); // -> Timestamp above in local TZ 

https://www.npmjs.com/package/julian

在接受的答案中给出的最终代码似乎是错误的 。 查看美国海军观测网站的“官方”在线计算器:

http://aa.usno.navy.mil/data/docs/JulianDate.php

如果有人知道回答时间和日历的正确答案,那就是USNO。