在javascript中计算Jday(Julian Day)

Esh*_*Esh 16 javascript jquery

我需要jday在javascript中进行计算,对于客户端验证,任何人都可以帮助我如何计算JDAYjavascript或脚本以将给定的JDAY更改为实际日期,反之亦然.

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

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

我也参考以下网站进行JAVA中提到的计算

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

先感谢您

ade*_*neo 24

朱利安日

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

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

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

第一个朱利安循环的起点始于公元前4713年1月1日格林威治标准时间中午,并将于格林威治标准时间中午3268年1月22日结束,整天后正好是7980.

例如,2016年1月1日的朱利安日数为2,457,389,这是自那天公元前4713年1月1日以来的天数.

如何计算它

我们知道Unix时间是自1970年1月1日00:00:00以来的秒数,不计算闰秒,也称为Epoch,我们可以使用一些数学来计算我们已经拥有Unix的Julian日时间.

GMT和UTC在实践中共享相同的当前时间,因此,应该没有区别.

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

有了这个从未改变的设定天数,我们可以添加从1970年1月1日到今天的天数,这是Javascript最终返回的天数,以获得朱利安日.

这些年没有加起来,只是通过搜索网络,它告诉我们公元前4713年到公元1970年之间的天数差异是2440588天,​​因为朱利安周期从中午开始,而不是在午夜,我们必须正好减半天,减去2440587.5天.

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

通过一些简单的数学运算,我们可以发现一天的长度为86,400秒,使用Javascript时Unix时间戳以毫秒为单位,因此UNIX TIME / 86400000我们将获得自1970年1月1日星期四至今的天数.

现在只是一天,我们想要整天,而不是分数,并且可以将它整理到整个关闭的日子,做类似的事情

Math.floor((UNIX TIME / 86400000) + 2440587.5);
Run Code Online (Sandbox Code Playgroud)

朱利安日期

有时在编程中,"朱利安日期"已经表示自年开始以来的天数,例如2016年6月1日将是该年的152天等.

正确使用"朱利安日期"是朱利安日,时间戳添加为当天的小数部分.

以这个答案的顶部为例,2016年1月1日是朱利安日2,457,389,我们可以增加一个时间.
朱利安日从中午开始,没有增加分数时间,因此在午夜时分将是2457389.518:00,或中午后6小时,它会2457389.25增加"半天","一天四分之一"等.

再次计算它

这意味着0.1 Julian日期与24小时除以10相同,或者24 / 10 === 2.4 hours换句话说,Julian Day时间戳是带小数的小数(一天的十分之一等).

让我们看一些Javascript函数,首先是Date构造函数.

Javascript只能访问运行它的计算机上的本地时间,所以当我们这样做new Date()时,即使UNIX时间是UTC,也不需要创建UTC日期,new Date从而为您提供从epoch到本地计算机的任何当地时间的秒数有,并没有考虑你的时区.

但是Date.UTC,Javascript确实会以UTC格式返回日期,让我们检查差异,这当然会根据您设置本地系统的时区而有所不同.

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';
Run Code Online (Sandbox Code Playgroud)

请记住本章开头的部分,大约0.1 Julian日期与24小时相同,除以10,或者24 / 10 === 2.4 hours,2.4小时是144分钟,现在让我们快速查看Javascripts getTimezoneOffset()方法,文档说

getTimezoneOffset()方法返回当前语言环境与UTC的时区偏移(以分钟为单位).

因此,它以分钟为单位返回系统时区的偏移量,这很有趣,因为大多数处理日期的javascript方法都会返回毫秒数.

我们知道一天中的1/10是144分钟,因此10/10或一整天将是1440分钟,因此我们可以使用一些数学来抵消当地系统时区,以分钟为单位,并除以它一天中的分钟数,以获得正确的小数值

所以现在我们有了

2440587.5 days + UNIX TIME in days === Julian Day
Run Code Online (Sandbox Code Playgroud)

我们知道Javascripts Date构造函数并没有真正使用UTC作为当前日期,而是系统时间,所以我们必须要

TIMEZONEOFFSET / 1440
Run Code Online (Sandbox Code Playgroud)

加入他们我们会得到

(JAVASCRIPT TIME / 86400000) - (TIMEZONEOFFSET / 1440) + 2440587.5
//  ^^ days since epoch ^^      ^^ subtract offset ^^    ^^days from 4713 B.C. to 1970 A.D.
Run Code Online (Sandbox Code Playgroud)

将其翻译为javascript即可

var date = new Date();     // a new date
var time = date.getTime(); // the timestamp, not neccessarely using UTC as current time

var julian_day = (time / 86400000) - (date.getTimezoneOffset()/1440) + 2440587.5);
Run Code Online (Sandbox Code Playgroud)

现在这也是我们应该用来获得朱利安,采取措施去除时区偏移,当然没有朱利安日期的分数时间部分.
我们可以通过简单地将其舍入到最接近的整数来实现

var julian_date = Math.floor((time / 86400000) - (date.getTimezoneOffset()/1440) + 2440587.5));
Run Code Online (Sandbox Code Playgroud)

现在是时候回答这个问题了,在我做了这么长时间的编辑之后,在评论字段中投诉之后解释为什么这是正确的方法.

Date.prototype.getJulian = function() {
  return Math.floor((this / 86400000) - (this.getTimezoneOffset() / 1440) + 2440587.5);
}

var today = new Date(); //set any date
var julian = today.getJulian(); //get Julian counterpart

console.log(julian)
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {top:0}
Run Code Online (Sandbox Code Playgroud)

而同样该fracional部分

Date.prototype.getJulian = function() {
  return (this / 86400000) - (this.getTimezoneOffset() / 1440) + 2440587.5;
}

var today = new Date(); //set any date
var julian = today.getJulian(); //get Julian counterpart

console.log(julian)
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { top: 0 }
Run Code Online (Sandbox Code Playgroud)

并完成,一个显示原因的例子

new Date().getTime()/86400000 + 2440587.5
Run Code Online (Sandbox Code Playgroud)

如果您的系统时间设置为具有偏移的时区(即GMT以外的任何其他区域),则至少不起作用

// the correct approach
Date.prototype.getJulian = function() {
    return (this / 86400000) - (this.getTimezoneOffset() / 1440) + 2440587.5;
}

// the simple approach, that does not take the timezone into consideration
Date.prototype.notReallyJulian = function() {
  return this.getTime()/86400000 + 2440587.5;
}
// --------------

// remember how 18:00 should return a fractional 0.25 etc
var date = new Date(2016, 0,    1,   18,   0,   0,    0); 
//                   ^    ^     ^     ^    ^    ^     ^
//                 year  month date  hour min  sec  milli
                   
var julian = date.getJulian();       //get Julian date
var maybe  = date.notReallyJulian(); // not so much

console.log(julian); // always returns 2457389.25
console.log(maybe);  // returns different fractions, depending on timezone offset
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { top: 0 }
Run Code Online (Sandbox Code Playgroud)

  • 为不知情的读者(像我昨天一样)单挑:这个答案给出了整数局部Julian日期(如2456483); Wilbert的答案给出了一个UTC Julian日期,包括代表时间的分数(如2456483.8500826736). (4认同)

Wil*_*ert 10

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

这就是天文学家称朱利安的日期.它定义明确.由于Unix时间戳和JD都没有考虑闰秒,因此不会降低准确性.请注意,JD不需要在时区UTC(但通常是).这个答案为您提供了时区UTC的JD.

  • .5 是导致京东在中午开始的半天偏移量。天文学家使用这个系统来防止他们的日期在夜间观测期间发生变化。 (2认同)

jba*_*bey 5

根据维基百科

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
Run Code Online (Sandbox Code Playgroud)

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

注意:这是不正确的,因为这里忘记了 Wiki 上的“地板括号”。

正确的公式是:

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
Run Code Online (Sandbox Code Playgroud)