Преобразовать юлианскую метку времени в обычное время в UNIX - PullRequest
4 голосов
/ 09 ноября 2011

Мне нужно преобразовать юлианскую метку времени в обычную метку времени в UNIX, используя Bash.

В Tandem OS преобразование довольно простое -

Пример: 212186319010244541

$OLSAPP SYSTST 1> #interprettimestamp 212186319010244541

#interprettimestamp 212186319010244541 expanded to:

2455860 2011 10 25 16 10 10 244 541

Я хочу сделать то же самое в среде UNIX.Преобразование будет частью скрипта парсера.Таким образом, один лайнер будет принята с благодарностью.

ОБНОВЛЕНИЕ :

Встроенная функция INTERPRETTIMESTAMP в Tandem возвращает разделенный пробелами список из девяти чисел, состоящий из числа юлианских дней, года, месяца, дня, часа,минуты, секунды, миллисекунды и микросекунды.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

Предполагая, что это число, как @blahdiblah говорит

"значение, представляющее число микросекунд с 1 января 4713 г. до н.э."

Тогда вам сначала нужно узнатьюлианская временная метка для 01 января 1970 года, которая является эпохой для времени Unix.Таким образом, грубый запрос оракула дает

210866803200000000

Тогда вы могли бы в теории просто иметь команду оболочки для вычисления количества секунд с 1 января 1970 года.

unixtime=$(( ( 212186319010244541 - 210866803200000000 ) / 1000000 ))

С этим связаны следующие проблемы:

  • вам все еще нужно отформатировать его
  • ваш bash может не соответствовать целочисленной арифметике с 18-значными числами.(думаю, что все в порядке в 64-битной, но не в 32-битной версии).

Теперь, если у вас установлен Perl, вы можете решить их с помощью модулей bigint и POSIX.Как оболочка «один» лайнер выглядит как

perl -mbigint -mPOSIX -e 'print( POSIX::strftime("%Y-%m-%d %T",localtime( ($ARGV[0]-210866803200000000)/1000000 ) )."\n")' 212186319010244541

, что дает

2011-10-25 15:10:10

Разница в 1 час, вероятно, связана с разницей в летнем времени.Это может быть либо в perl, либо, скорее всего, значение, которое я использовал для 01 января 1970 года, может быть часом.Поэтому вам, возможно, придется проверить их обоих, чтобы убедиться, что они подходят для вашей системы.

0 голосов
/ 13 мая 2015

это MJD-конвертер

MJD -3506716800, чем эпоха

# date -d '1858-11-17 UTC' +%s
-3506716800

пример: MDJ 57153 - понедельник, 11 мая, 00:00:00 UTC, 2015

# date -d @`echo 57153*86400-3506716800|bc`
Mon May 11 00:00:00 UTC 2015
...