Подтвердить что ты не робот

Вычисление Jday (Julian Day) в javascript

У меня есть требование рассчитать jday в javascript, для проверки на стороне клиента. Может ли кто-нибудь помочь мне рассчитать jday в javascript или script, чтобы изменить данный JDAY на фактическую дату или наоборот.

Чтобы узнать, что такое JDay, я нашел следующий сайт,

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

Также ссылаюсь на приведенный ниже сайт для расчета, упомянутого в JAVA

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

Заранее благодарю

4b9b3361

Ответ 1

Юлианский день

Юлийский День - это количество прошедших дней с начала цикла в 7980 лет.

Изобретаемый в 1583 году Джозефом Скалигером, цель системы состоит в том, чтобы упростить вычислять разницу целых чисел (целое число) между одной датой календаря и другой календарной датой.

Сезон 7980 лет был получен путем объединения нескольких традиционных временных циклов (солнечного, лунного и конкретного римского налогового цикла), для которых 7980 было общим кратным.

Начальная точка для первого юлианского цикла началась 1 января 4713 г. до н.э. в полдень по Гринвичу, и завершится 22 января 3268 в полдень GMT, ровно 7980 дней спустя.

В качестве примера, число юлианских дней на 1 января 2016 года составило 2 457 389, что составляет число дней с 1 января 4713 г. до н.э. в этот день.

Как рассчитать его

Как мы знаем, время Unix - это количество секунд с 00:00:00 по UTC, 1 января 1970 года, не считая секунд прыжка, а также называемое Epoch, мы можем использовать математику для вычисления Юлианского дня, когда мы уже имеют время Unix.

GMT и UTC используют то же самое время на практике, поэтому для этого не должно быть разницы.

Начнем с того, что нам нужно знать количество дней, с которых начался юлианский цикл, до тех пор, пока не начнутся отметки времени Unix.
Другими словами, количество дней с 1 января 4713 г. до н.э. в 12:00:00 по Гринвичу, до 1 января 1970 года в 00:00:00 по тихоокеанскому времени.

С учетом этого количества дней, которое никогда не изменится, мы можем просто добавить количество дней с 1 января 1970 года по сегодняшний день, и это то, что Javascript возвращает в любом случае, чтобы получить Юлианский день.

Без сложения всех этих лет, но просто путем поиска в Интернете, это говорит нам, что разница в днях между годом 4713 B.C. и 1970 A.D. составляет 2440588 дней, и потому что Юлианский Цикл начался в полдень, а не в полночь, мы должны вычесть ровно полдня, делая это 2440587.5 дней.

Итак, теперь у нас есть 2440587.5 days + UNIX TIME in days === Julian Day

С помощью простой математики мы можем понять, что день составляет 86 400 секунд, а временная метка Unix - в миллисекундах при использовании Javascript, поэтому UNIX TIME / 86400000 получит нам количество дней с четверга, 1 января 1970 года, до сегодняшнего дня,

Теперь в течение всего дня мы хотели целое количество дней, а не дробное, и можем просто округлить его до закрытия всего дня, делая что-то вроде

Math.floor((UNIX TIME / 86400000) + 2440587.5);

Юлианская дата

Иногда в программировании "юлианская дата" означает количество дней с начала года, например, 1 июня 2016 года было бы 152 дня в этом году и т.д.

Правильное использование "Юлианской даты" - это юлианский день с отметкой времени, добавленной как дробная часть дня.

Взяв пример в верхней части этого ответа, где 1 января 2016 года был июльский день 2 457 389, мы можем добавить к нему время.
Юлианский день начинается в полдень без добавочного времени, и в полночь будет 2457389.5, а в 18:00 или через шесть часов после полудня это будет 2457389.25, добавив "полдня", четверть дня "и т.д.

Вычисление, опять

Это означает, что 0,1 Julian Date совпадает с 24 часами, деленными на 10 или 24 / 10 === 2.4 hours, или, другими словами, временные метки Julian Day являются дробными с десятичными знаками (одна десятая дня и т.д.).

Давайте рассмотрим некоторые функции Javascript, прежде всего конструктор Date.

Javascript имеет доступ только к локальному времени на компьютере, на котором он выполняется, поэтому, когда мы делаем new Date(), он не обязательно создает дату UTC, даже если время UNIX находится в UTC, new Date дает вам количество секунд от эпохи до любого локального времени, которое имеет ваш компьютер, и не учитывает ваш часовой пояс.

Однако Javascript имеет 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';

Ответ 2

new Date().getTime()/86400000 + 2440587.5 получит отметку времени unix, преобразует ее в дни и добавляет JD 1970-01-01, которая является эпохой отметки времени unix.

Это то, что астрономы называют юлианской датой. Он хорошо определен. Поскольку ни отметка времени Unix, ни JD не учитывают секунды прыжка, что не снижает точность. Обратите внимание, что JD не обязательно должен находиться в часовом поясе UTC (но обычно есть). Этот ответ дает вам JD во временной зоне UTC.

Ответ 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

Ответ 4

Кроме того, для этого есть пакет npm:

julian

Преобразование между объектом Date и юлианскими датами, используемыми в астрономии и истории

  var julian = require('julian');

  var now = new Date();           // Let say it 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

Ответ 5

Кажется, что окончательный код, указанный в принятом ответе, неверен. Проверьте "официальный" онлайн-калькулятор на веб-сайте US Naval Observarory:

http://aa.usno.navy.mil/data/docs/JulianDate.php

Если кто-то знает правильный ответ на время ответа и календарь, это USNO.

Ответ 6

Что бы вы ни делали, НЕ ИСПОЛЬЗУЙТЕ getTimezoneOffset() в даты, предшествующие изменению политики в текущей локали, в прошлом она полностью нарушалась (к правилам базы данных iana она не применяется). Например, если я введу (дата UTC 1 октября 1995 года в 00:00:00):
var d=new Date(Date.UTC(1995, 9, 1, 0, 0, 0)); console.log(d.toLocaleString()); console.log(d.getTimezoneOffset());
в консоли javascript в Chrome он печатает (я во Франции):
01/10/1995 в 01:00:00 & lt; = это зимнее время, +1: 00 от UTC
-120 & lt; = НО это смещение летнего времени (должно быть -60 для зимы)
Между 1973 и 1995 годами (включительно) DST (-120) прекратил работу в последнее воскресенье сентября, поэтому для 1 октября 1995 года getTimezoneOffset() должен вернуть -60, а не -120. Обратите внимание, что форматированная дата правильная (01:00:00 является ожидаемой -60). Тот же результат в Firefox, но в IE и Edge, что еще хуже, даже отформатированная дата неверна (01/10/1995 02: 00: 00, что соответствует плохой -120 результат getTimezoneOffset()). Каким бы ни был браузер (из этих 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; = нормально, нет летнего времени в июне 1970 года, +1: 00
 -120 & lt; = та же проблема, должна быть -60 и здесь
Кроме того, то же самое в Firefox, хуже в IE/Edge (01/07/1970 02: 00: 00).

Ответ 7

Я сделал это для равноденствия и солнцестояния. Вы можете использовать функцию для любой юлианской даты. Возвращает юлианскую дату в формате календарной даты: день/месяц. Укажите год, и вы можете отформатировать его так, как хотите. Это все там, год, месяц, день. Поскольку 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);