Для наших систем ночной сборки я написал программу на C, которая выполняет расчеты (с использованием локальных проприетарных библиотек, которые хранят даты в виде количества дней после контрольной даты).В основном, учитывая (неизменную) контрольную дату, она сообщает количество дней с контрольной даты.Таким образом, сценарий cron
будет включать в себя первый день с жесткой привязкой, и программа сообщит о количестве дней с тех пор.
Большим преимуществом этой системы является то, что контрольная дата неизменяются (очень часто), поэтому сценарий не меняется (очень часто) и отсутствуют внешние файлы для хранения информации.
Возможно, есть способы добиться того же эффекта с помощью стандартных инструментов Unix, ноЯ не сел и не разработал портативное решение.Я, наверное, думаю, что это условия использования Perl.(Программа на C работает только до 2999 года CE; я оставил в коде заметку, чтобы люди связались со мной примерно за 50 лет до того, как это станет проблемой для исправления Y3K. Это, вероятно, тривиально.)
Вы могли бывозможно, работать с временными метками Unix ...
Создать сценарий days_since 1234567890, который обрабатывает число как контрольную дату, получает текущую метку времени (от date
с соответствующей спецификацией формата; в Linux,date '+%s'
выполнит эту работу, и она также работает в Mac OS X), возьмет разницу и разделит на 86 400 (количество секунд в дне).
refdate=1234567890
bc <<EOF
scale=0
($(date '+%s') - $refdate) / 86400
EOF
Пример:
$ timestamp 1234567890
1234567890 = Fri Feb 13 15:31:30 2009
$ timestamp
1330027280 = Thu Feb 23 12:01:20 2012
$ refdate=1234567890
$ bc <<EOF
> scale=0
> ($(date '+%s') - $refdate) / 86400
> EOF
1104
$
Итак, если исходной датой было 13 февраля 2009 г., сегодня - день 1104. (Программа bc
- это калькулятор; ее название не имеет ничего общего с Anno Domini или Before Christ). Программа timestamp
это еще один мой домашний напиток, который печатает временные метки в соответствии с форматом, который может быть указан, это специализированный вариант date
, изначально написанный за несколько дней до того, как date
имел функциональностьЯ имею в виду в начале 1980-х годов.)
В однострочнике Perl (при условии, что вы указали в своем сценарии ссылочную дату):
perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)'
или:
days=$(perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)')