- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我需要在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);
2457389.5
,在18:00或中午六小时后,它将是
2457389.25
,并添加“半天”,“一天的四分之一” ”等
24 / 10 === 2.4 hours
,换句话说,朱利安日时间戳记是小数,并带有小数(一天的十分之一等)。
Date
构造函数。
new Date()
时,它不必创建UTC日期,即使UNIX时间是UTC,
new Date
也会为您提供从纪元到本地时间的秒数。您的计算机有,并且没有考虑您的时区。
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';
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.
2440587.5 days + UNIX TIME in days === Julian Day
TIMEZONEOFFSET / 1440
(JAVASCRIPT TIME / 86400000) - (TIMEZONEOFFSET / 1440) + 2440587.5
// ^^ days since epoch ^^ ^^ subtract offset ^^ ^^days from 4713 B.C. to 1970 A.D.
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);
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
// 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/
我是一名优秀的程序员,十分优秀!