gpt4 book ai didi

javascript - 用JavaScript计算Jday(Julian Day)

转载 作者:可可西里 更新时间:2023-11-01 01:21:43 32 4
gpt4 key购买 nike

我需要在javascript中计算jday以便进行客户端验证,有人可以帮我如何在javascript或脚本中计算JDAY来将给定的JDAY更改为实际日期,反之亦然。

要知道JDay是什么,我发现了以下站点,

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

我还引用了JAVA中提到的以下站点进行计算

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

先感谢您

最佳答案

朱利安·戴(Julian Day)

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

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

7980年的周期是通过合并几个传统的时间周期(太阳,农历和特定的罗马税制)得出的,而7980是其常见倍数。

第一个朱利安周期的起点始于公元前4713年1月1日。在格林尼治标准时间(GMT)中午,并将于格林尼治标准时间3268年1月22日,即整整7980天结束。

例如,2016年1月1日的儒略日数为2,457,389,这是自公元前4713年1月1日以来的天数。在那一天。

如何计算

我们知道Unix时间是自1970年1月1日UTC时间00:00:00起的秒数,不计算leap秒,也称为大纪元,当我们已经拥有Unix时,我们可以使用一些数学方法来计算儒略日时间。

GMT和UTC实际上在同一时间共享当前时间,因此,这应该没有区别。

首先,我们需要知道从朱利安周期开始到Unix时间戳开始之间的天数。
换句话说,是从公元前4713年1月1日起的天数。格林尼治标准时间12:00:00,直到1970年1月1日世界标准时间。

有了这个固定的天数,这个天数永远不会改变,我们只需加上从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);

朱利安日期

有时在编程中,“Julian日期”是指自年初以来的天数,例如2016年6月1日将是该年的152天,以此类推。

正确使用“朱利安日期”是儒略日,其中添加了时间戳作为该日的一部分。

以该答案顶部的示例为例,在2016年1月1日是儒略日2,457,389,我们可以添加一个时间。
朱利安纪念日从中午开始,不添加小数时间,因此在午夜将是 2457389.5,在18:00或中午六小时后,它将是 2457389.25,并添加“半天”,“一天的四分之一” ”等

再次计算

这意味着0.1朱利安日期等于24小时除以10,或者等于 24 / 10 === 2.4 hours,换句话说,朱利安日时间戳记是小数,并带有小数(一天的十分之一等)。

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

Javascript只可以访问运行它的计算机上的本地时间,因此,当我们执行 new Date()时,它不必创建UTC日期,即使UNIX时间是UTC, new Date也会为您提供从纪元到本地时间的秒数。您的计算机有,并且没有考虑您的时区。

但是,Javascript确实具有 Date.UTC,它将以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';


记得本章开始的那部分,大约0.1朱利安日期等于24小时除以10,或者等于 24 / 10 === 2.4 hours,那么2.4小时就是144分钟,现在让我们快速看一下Javascripts getTimezoneOffset()方法,文档说

The getTimezoneOffset() method returns the time-zone offset from UTC, in minutes, for the current locale.



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

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

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

而且我们知道Javascript Date构造函数实际上不是使用UTC作为当前日期,而是使用系统时间,因此我们必须
TIMEZONEOFFSET / 1440

加入他们在一起,我们会得到
(JAVASCRIPT TIME / 86400000) - (TIMEZONEOFFSET / 1440) + 2440587.5
// ^^ days since epoch ^^ ^^ subtract offset ^^ ^^days from 4713 B.C. to 1970 A.D.

将其翻译为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);

现在,这也是我们应该用来获取Julian Day 的方法,采取措施来消除时区偏移,并且当然不使用Julian Date 的小数时间部分。
我们可以通过简单的四舍五入将其四舍五入为最接近的整数
var julian_date = Math.floor((time / 86400000) - (date.getTimezoneOffset()/1440) + 2440587.5));

现在是我对这个问题的原始答案的时候了,在进行了非常长的编辑以解释为什么这是正确的方法之后,在评论字段中提出了投诉之后。

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)
.as-console-wrapper {top:0}


与的分数部分相同的

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)
.as-console-wrapper { top: 0 }


最后,一个例子说明了为什么
new Date().getTime()/86400000 + 2440587.5

不起作用,至少如果您的系统时间设置为带偏移的时区(即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
.as-console-wrapper { top: 0 }

关于javascript - 用JavaScript计算Jday(Julian Day),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11759992/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com