2017-02-03 9 views
0

У меня есть стол с двумя колонками: год и день года. Я хотел бы тайному их даты (год-месяц-день)конвертировать из года и дня года в bash

Следующая команда, кажется, правильно читать только год, но не день года:

date -j -f "%Y %j" "2005 241" +%F 
2005-02-03 

Я использую Баш на ОС X. Какие-нибудь рекомендации?

Решение

$ yyyy="2015"; doy="241"; echo $(date -jf %s $(($(date -jf "%F %T" "$yyyy-01-01 23:59:30" +%s) + ((10#$doy - 1)) * 86400)) +"%F %T") 
2015-08-29 23:59:30 
$ date -j 082923592015 +%j 
241 

Поэтому в основном мы берем данный год и построить время в первый день этого года (то есть, Jan 01) и преобразовать его в секундах. Затем мы добавляем общее количество секунд с первого дня года (осторожно здесь! Мы должны вычесть его, поскольку подсчет относится к 01 января). Полученное суммирование, выраженное в секундах, окончательно преобразуется в ожидаемый формат.

  • -j не устанавливает дату
  • -f позволяют определить формат входного сигнала
  • + позволяет указывать формат вывода
  • % S секунд с 1970 года -01-01 00:00:00 UTC
  • % F формат даты такой же, как% Y-% m-% d
  • % T формат времени так же, как% H:% M:% S
  • % J день года как 3-значное число (например, 001 ... 366)
  • $ (()) задать арифметический контекст
  • 10 #. преобразовать число по основанию 10 для того, чтобы избежать проблем с ведущими нулями на день года (например, 009, 099)

ответ

1

Используя дату Mac OS, я успешно запустить:

date -j -f %s $(($(date -j 0101012015 +%s)+241*86400)) +%F 
2015-08-30 

date -j -f %s $(date -j -f %F 2015-01-01 +%s+241*86400 | bc) +%F 
2015-08-30 

Где, используя дату GNU v8.13 I нас е:

date -d "2005-1-1 +241 days" +%F 
2005-08-30 
+0

@Inian Я добавил способ сделать это под Mac, Баш –

+0

@Hauri: Если вы запустите команду реверса в GNU 'дата -d 20150830 +% j' ответ 242 вместо из 241. Поэтому необходимо вычесть один день 'date -d" 2005-1-1 +240 дней "+% F' , поскольку подсчет начинается с 01 января. – AjanO