在javascript中计算Jday(Julian Day)

时间:2012-08-01 13:08:44

标签: javascript jquery

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

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

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

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

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

提前谢谢

7 个答案:

答案 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 

https://www.npmjs.com/package/julian

答案 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保持同步。