bash - как получить (текущий) номер дня по юлианскому календарю?

Как получить эквивалент сегодняшнего числа дней по юлианскому календарю (JDN)? или любые даты, если уж на то пошло?

Я искал и искал, но нашел только некоторые функции, которые выдавали "year-dayOfYear", а не что-то вроде: 2457854.


person Buffalo    schedule 10.04.2017    source источник


Ответы (4)


в bash date +%j возвращает дату по юлианскому календарю.

[root@TX-Serv-1 ~]# date +%j
108

Также юлианские даты в будущем тоже довольно просты.

[root@es-host01 ~]# date --date='10 days' +%j
119
[root@es-host01 ~]# date --date='2 weeks' +%j
123
person DeanGuilberry    schedule 19.04.2017
comment
Чем число 108 похоже на JDN? пожалуйста, внимательно прочитайте вопрос - person Buffalo; 19.04.2017
comment
Хотя она отвечает на неправильный вопрос (порядковый номер даты/дня года вместо даты по юлианскому календарю), это небольшая полезная команда. Вот разница между ними, которая показывает, почему может возникнуть путаница, если вы прочитаете только заголовок вопроса: en.wikipedia.org/wiki/Julian_day#Терминология - person kevinmicke; 24.04.2017

В итоге я сам портировал один. Вот SSCCE:

#!/bin/bash

function GetJulianDay # year, month, day
{
  year=$1
  month=$2
  day=$3

  jd=$((day - 32075 + 1461 * (year + 4800 - (14 - month) / 12) / 4 + 367 * (month - 2 + ((14 - month) / 12) * 12) / 12 - 3 * ((year + 4900 - (14 - month) / 12) / 100) / 4))

  echo $jd
}

function GetTodayJulianDay
{
  year=`date +"%Y"`
  month=`date +"%m"`
  day=`date +"%d"`

  todayJd=$(GetJulianDay $year $month $day)

  echo $todayJd
}

# samples

todayJd=$(GetTodayJulianDay)
echo "got today jd: $todayJd"

yesterdayJd=$(GetJulianDay 2017 4 9)
echo "got yesterday jd: $yesterdayJd"

Протестируйте: http://aa.usno.navy.mil/data/docs/JulianDate.php

person Buffalo    schedule 10.04.2017
comment
+ за использование ресурса navy.mil. Сайт jpl.gov также очень хорош для таких вещей. - person David C. Rankin; 10.04.2017

Вы можете получить дату Unix с помощью date +%s --date=YYYYMMDD и использовать ее для вычисления юлианского дня из даты Unix

В итоге получилось бы что-то вроде:

echo $(( $(date +%s --date=YYYYMMDD) / 86400 + 2440587 ))

Редактировать: я не знаю, насколько это важно, но некоторым людям нравится добавлять 0,5 к конверсии. В основном это означает, что если ваша текущая дата/время после полудня, преобразование поместит дату по юлианскому календарю на 1 день позже.

person vdavid    schedule 10.04.2017
comment
Я выбрал проверенную версию Java, которую мы использовали. Ваш выглядит гораздо аккуратнее. Я дам ему шанс, когда у меня будет немного времени. - person Buffalo; 19.04.2017

OLD_JULIAN_VAR=$(date -u -d 1840-12-31 +%s)

TODAY_DATE=`date --date="$odate" +"%Y-%m-%d"`
TODAY_DATE_VAR=`date -u -d "$TODAY_DATE" +"%s"`
export JULIAN_DATE=$((((TODAY_DATE_VAR - OLD_JULIAN_VAR))/86400))
echo $JULIAN_DATE

математически

[(date in sec)-(1840-12-31 in sec)]/86400 
person user11034172    schedule 08.02.2019