У меня есть стол с двумя колонками: год и день года. Я хотел бы тайному их даты (год-месяц-день)конвертировать из года и дня года в 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)
@Inian Я добавил способ сделать это под Mac, Баш –
@Hauri: Если вы запустите команду реверса в GNU 'дата -d 20150830 +% j' ответ 242 вместо из 241. Поэтому необходимо вычесть один день 'date -d" 2005-1-1 +240 дней "+% F' , поскольку подсчет начинается с 01 января. – AjanO