我需要在javascript中计算jday
,以便进行客户端验证,任何人都可以帮助我如何在javascript或脚本中计算JDAY
以将给定的JDAY更改为实际日期,反之亦然。
要知道什么是JDay,我找到了以下网站,
http://www.pauahtun.org/Software/jday.1.html
我也参考以下网站进行JAVA中提到的计算
http://www.rgagnon.com/javadetails/java-0506.html
提前谢谢
答案 0 :(得分:10)
new Date().getTime()/86400000 + 2440587.5
将获得unix时间戳,将其转换为天数并添加1970-01-01的JD,这是unix时间戳的时代。
天文学家称之为朱利安约会。它定义明确。由于Unix时间戳和JD都没有考虑闰秒,因此不会降低准确性。请注意,JD不需要在时区UTC(但通常是)。这个答案为您提供了时区UTC的JD。
答案 1 :(得分:3)
根据wikipedia:
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
如果您在实施方面遇到更具体的问题,请在问题中提供这些详细信息,以便我们进一步提供帮助。
注意:这是不正确的,因为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
答案 2 :(得分:0)
此外,还有一个npm包:
julian
在天文学和历史中使用的Date对象和Julian日期之间进行转换
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
答案 3 :(得分:0)
似乎在接受的答案中给出的最终代码是错误的。检查"官方"美国海军Observarory网站上的在线计算器:
http://aa.usno.navy.mil/data/docs/JulianDate.php
如果有人知道答案时间和日历的正确答案,那么它就是USNO。
答案 4 :(得分:0)
无论你做什么,都不要在当前Locale中更改策略之前的日期使用getTimezoneOffset(),它在过去完全被破坏(它不适用于iana database rules)。
例如,如果我输入(UTC日期1995年10月1日00:00:00):
var d=new Date(Date.UTC(1995, 9, 1, 0, 0, 0)); console.log(d.toLocaleString()); console.log(d.getTimezoneOffset());
在Chrome的javascript控制台中,它打印(我在法国):
01/10/1995 01:00:00 < =这是冬季时间,距离UTC +1:00
-120 < =但这是夏令时偏移(冬天应为-60)
在1973年至1995年(包括)之间,DST(-120)在9月的最后一个星期日终止,因此在1995年10月1日,getTimezoneOffset()
应该返回 -60 ,而不是 -120 < / strong>即可。请注意,格式化日期是正确的( 01:00:00 是预期的 -60 )。
在Firefox中也有相同的结果,但在IE和Edge中,情况更糟,甚至格式化的日期也是错误的( 01/10 / 1995 02:00:00 ,匹配getTimezoneOffset()
)的错误 -120 结果。无论浏览器(这4个),getTimezoneOffset()
使用当前规则而不是考虑日期的规则。
当DST未在法国(1946-1975),Chrome控制台应用时,同一问题的变化:
d=new Date(Date.UTC(1970, 6, 1, 0, 0, 0)); console.log(d.toLocaleString()); console.log(d.getTimezoneOffset());
显示:
01/07/1970 01:00:00 &lt; = ok,1970年6月没有DST,+ 1:00
-120 &lt; =同样的问题,这里也应该 -60
而且,在Firefox中也是如此,IE / Edge更糟糕( 01/07/1970 02:00:00 )。
答案 5 :(得分:0)
我这样做是为了春分和Solistice。您可以将函数用于任何儒略日期。 它以日历日期格式返回天历日期:天/月。 包括年份,您可以随时格式化它。 年,月,日都在那里。 由于Equinox和Solistice是时间戳而不是日期,因此代码中的日期以小数形式返回,因此为“ day = k.toFixed(0);”。对于其他朱利安日期,则应为day = k;
// For the HTML-page
<script src="../js/meuusjs.1.0.3.min.js"></script>
<script src="../js/Astro.Solistice.js"></script>
// Javascript, Julian Date to Calender Date
function jdat (jdag) {
var jd, year, month, day, l, n, i, j, k;
jd = jdag;
l = jd + 68569;
n = Math.floor(Math.floor(4 * l) / 146097);
l = l - Math.floor((146097 * n + 3) / 4);
i = Math.floor(4000 * (l + 1) / 1461001);
l = l - Math.floor(1461 * i / 4) + 31;
j = Math.floor(80 * l / 2447);
k = l - Math.floor(2447 * j / 80);
l = Math.floor(j / 11);
j = j + 2 - 12 * l;
i = 100 * (n - 49) + i + l;
year = i;
month = j;
day = k.toFixed(0); // Integer
dat = day.toString() + "/" + month.toString(); // Format anyway you want.
return dat;
}
// Below is only for Equinox and Solistice. Just skip if not relevant.
// Vernal Equinox
var jv = A.Solistice.march(year); // (year) predefined, today.getFullYear()
var vdag = jdat(jv);
// Summer Solistice
var js = A.Solistice.june(year);
var ssol = jdat(js);
//Autumnal Equinox
var jh = A.Solistice.september(year);
var hdag = jdat(jh);
// Winter Solistice
var jw = A.Solistice.december(year);
var vsol = jdat(jw);
答案 6 :(得分:0)
JD =>
const millisecondsSince1970Now = new Date+0
const julianDayNow = 2440587.5+new Date/864e5
const dateNow = new Date((julianDayNow-2440587.5)*864e5)
关于儒略日是什么以及如何计算它似乎有些困惑。
JavaScript时间以Jan 1, 1970 at midnight
的GMT / UTC毫秒UInt64来衡量。
JavaScript
Date
函数的Month,Day,Year方面均使用公历规则来实现。但是朱利安“天”不受此影响。但是将“天数”映射到 Julian 月,日,年。
因此,计算儒略日转换是从该时间点(格林尼治标准时间1970年1月1日/ UTC格里高利历法)开始的相对天数。
Jan 1, 1970
的儒略日为2440587.5
(0.5,因为儒略日始于中午)。
864e5
常量是86,400,000
(毫秒/天)的JavaScript表示法。
唯一的复杂性是在采用1582年格里高利历之前的儒略历日期(天),从教皇格雷戈里(Gregory)委托进行的更改中,要校正影响复活节的Le年漂移误差。直到1752年左右,世界上大多数使用儒略历(Julian Calendar)系统或派生类(俄罗斯和中国直到20世纪才采用)的国家都被完全采用。
朱利安·凯撒(Julius Caesar)46BC的“改革”任务规定执行儒略历(Julian)的前60年中出现的更为严重的错误是,牧师在折叠14/15个月日历时犯了错误,人们被误解了。 (因此在该时期的许多宗教日期和时间都有错误)。
?没有一个适用于儒略日值的JavaScript计算。
另请参见:(摘自AfEE EdgeS / EdgeShell脚本编写核心说明)
还有一个单独的细微之处"leap-second"适用于天文计算以及与地球轨道和旋转漂移有关的原子钟的使用。
,即每天
86,400.000
秒需要进行“调整”,以使日历(时区,GPS卫星)与当前86,400.002
保持同步。