如何从unix时间戳(例如1232559922)转换为小数julian日期(2454853.03150)。
我找到了一个执行类似计算的网站(http://aa.usno.navy.mil/data/docs/JulianDate.php),但我需要以编程方式进行。
解决方案可以是C / C ++,python,perl,bash等......
答案 0 :(得分:31)
Unix时代(零点)是格林尼治标准时间1970年1月1日。这相当于2440587.5的朱利安日。
所以,在伪代码中:
function float getJulianFromUnix( int unixSecs )
{
return ( unixSecs / 86400.0 ) + 2440587.5;
}
答案 1 :(得分:7)
我知道这是一篇旧帖子,但我只想说......
Jason Cohen给出的答案是转换的一个很好的近似值。
但是有一个问题与一天中的秒数有关。一天不是 - 完全 - 86400秒长,并且为了使时间与各种可观察标准保持同步,周期性地增加几天。这些被称为闰秒(https://en.wikipedia.org/wiki/Leap_second)。将闰秒添加到UTC,以使其保持在UT1的1秒内。
有理由认为,随着自1970年1月1日以来越来越多的时间过去,上面的简单转换将从“实际可观察时间”中产生越来越多的错误。在1972年至2013年间,又增加了25个闰秒。
朱利安日数字的美感和简洁性的一部分是它们根本不代表日期字符串。它们只是自Julian Epoch开始以来经过的时间的计数,就像POSIX时间是自POSIX Epoch以来的连续毫秒数。那么,唯一存在的问题是,当您尝试将Julian Day编号映射到本地化的日期字符串时。
如果您需要一个精确到一分钟(2013年)的日期字符串,那么您将需要一个可以计算闰秒的算法。
答案 2 :(得分:0)
以下是将 Unix 时间戳转换为 Julian 的JavaScript代码。最初显示当前的日期和时间,但有一点mod是您的问题的答案:
function computeJulianDate(DD,MM,YY,HR,MN,SC) {
with (Math) {
HR = HR + (MN / 60) + (SC/3600);
GGG = 1;
if (YY <= 1585) GGG = 0;
JD = -1 * floor(7 * (floor((MM + 9) / 12) + YY) / 4);
S = 1;
if ((MM - 9)<0) S=-1;
A = abs(MM - 9);
J1 = floor(YY + S * floor(A / 7));
J1 = -1 * floor((floor(J1 / 100) + 1) * 3 / 4);
JD = JD + floor(275 * MM / 9) + DD + (GGG * J1);
JD = JD + 1721027 + 2 * GGG + 367 * YY - 0.5;
JD = JD + (HR / 24);
}
return JD;
}
function getUTCDateTimeOrJD(now,jd=0) {
var hours = now.getUTCHours();
var minutes = now.getUTCMinutes();
var seconds = now.getUTCSeconds()
var month = now.getUTCMonth() + 1;
var day = now.getUTCDate();
var year = now.getUTCFullYear();
if (jd==1)
return computeJulianDate(month, day, year, hours, minutes, seconds);
else
return day+". "+month+". "+year+". "+hours+":"+minutes+":"+seconds;
}
var unixTime = 1473294606;
getUTCDateTimeOrJD(new Date(unixTime*1000));
getUTCDateTimeOrJD(new Date(unixTime*1000),1);