Преобразовать метку времени Unix в юлианский
Как я могу преобразовать метку времени Unix (скажем, 1232559922) в дробную юлианскую дату (2454853.03150).
Я нашел веб-сайт ( http://aa.usno.navy.mil/data/docs/JulianDate.php), который выполняет аналогичные вычисления, но мне нужно сделать это программно.
Решения могут быть в C/C++, Python, Perl, Bash и т.д...
4 ответа
Эпоха Unix (нулевая точка) - 1 января 1970 г. по Гринвичу. Это соответствует юлианскому дню 2440587,5
Итак, в псевдокоде:
function float getJulianFromUnix( int unixSecs )
{
return ( unixSecs / 86400.0 ) + 2440587.5;
}
Я знаю, что это старый пост, но я просто скажу...
Ответ, данный Джейсоном Коэном, является хорошим приближением к конверсии.
Однако существует проблема, связанная с количеством секунд в одном дне. День не длится 86400 секунд, и к дням добавляются секунды, чтобы синхронизировать время с различными наблюдаемыми стандартами. Они называются прыжковыми секундами ( https://en.wikipedia.org/wiki/Leap_second). Дополнительные секунды добавляются к UTC, чтобы сохранить его в течение 1 секунды от UT1.
Само собой разумеется, что, поскольку с 1 января 1970 года прошло все больше и больше времени, простое приведенное выше преобразование будет накапливать все больше и больше ошибок из "фактического наблюдаемого времени". Между 1972 и 2013 годами было добавлено 25 дополнительных секунд.
Часть красоты и простоты юлианских чисел в том, что они вообще не представляют строки даты. Это просто подсчет времени, прошедшего с начала юлианской эпохи, так же, как время POSIX - это непрерывный подсчет миллисекунд с начала эпохи POSIX. Единственная проблема, которая существует, заключается в том, что вы пытаетесь сопоставить число юлианского дня с локализованной строкой даты.
Если вам нужна строка с точностью до одной минуты (в 2013 году), вам потребуется алгоритм, который может учитывать дополнительные секунды.
Этот вопрос был задан более 13 лет назад на момент написания статьи. Это довольно дико. Благодаря формуле JS eapo я преобразовал ее в PineScript v5, и при тестировании она, по крайней мере, очень близка. Я не думаю, что абсолютная точность будет иметь значение для большинства приложений TradingView (если таковые имеются). Таким образом, я не зашел так далеко, чтобы обеспечить идеальную точность. Но это работает. Спасибо eapo, вы сэкономили мне кучу времени.
РЕДАКТИРОВАТЬ: TradingView отображает время в часовом поясе фондовой/валютной биржи. Таким образом, возникла необходимость в создании дополнительных аргументов для обеспечения смещения UTC, используемого биржами.
[ВАЖНО: имейте в виду, что биржи, использующие летнее время,UTC - n
кUTC - n - 1
в зависимости от состояния летнего времени. Вы должны соответствующим образом обновить аргумент смещения UTC.]
// Julian Date & Partial Day in CST
computeJulianDate(dd, mm, yy, hr, mn, sc, offset=0, live=false) =>
HR = hr
HR := hr + (mn / 60) + (sc / 3600)
GGG = 1
if year <= 1585
GGG := 0
float JD = -1 * math.floor(7 * (math.floor((mm + 9) / 12) + yy) / 4)
S = 1
if ((mm - 9)<0)
S :=-1
A = math.abs(mm - 9)
J1 = math.floor(yy + S * math.floor(A / 7))
J1 := -1 * math.floor((math.floor(J1 / 100) + 1) * 3 / 4)
JD := JD + math.floor(275 * mm / 9) + dd + (GGG * J1)
JD := JD + 1721027 + 2 * GGG + 367 * yy
JD := JD + (HR / 24)
barsInSession = timeframe.isintraday ? ((24 * 60) / timeframe.multiplier) : timeframe.multiplier
barsInSession := math.floor(barsInSession) == barsInSession and timeframe.isintraday ? barsInSession - 1 : math.floor(barsInSession)
offsetInc = 1 / barsInSession
offsetCt = (offset * ((barsInSession / 24) * offsetInc))
JD := live ? JD + offsetCt : math.floor(JD - offsetCt) - 0.5
JD
Вот мой код JavaScript для преобразования метки времени Unix в юлианский. Первоначально показывает текущую дату и время, но с небольшим модом ответ на ваш вопрос:
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);