在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
在接受的答案中给出的最终代码似乎是错误的 。 查看美国海军观测网站的“官方”在线计算器:
http://aa.usno.navy.mil/data/docs/JulianDate.php
如果有人知道回答时间和日历的正确答案,那就是USNO。