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 offsetRun Code Online (Sandbox Code Playgroud)
.as-console-wrapper { top: 0 }Run Code Online (Sandbox Code Playgroud)
Wil*_*ert 10
new Date().getTime()/86400000 + 2440587.5
将获得unix时间戳,将其转换为几天并添加1970-01-01的JD,这是unix时间戳的时代.
这就是天文学家称朱利安的日期.它定义明确.由于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
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)
| 归档时间: |
|
| 查看次数: |
17523 次 |
| 最近记录: |