Ошибка при генерации определенных дат
Генерирую список дат в определенном диапазоне.
Код из файла date-list-generator.sh:
input_start=1900-01-01
input_end=2025-12-31
startdate=$(date -I -d "$input_start") || exit -1
enddate=$(date -I -d "$input_end") || exit -1
d="$startdate"
while [ "$d" != "$enddate" ]; do
echo $(date -d "$d" +"%d%m%Y")
d=$(date -I -d "$d + 1 day")
done
Почему в Bash возникают ошибки именно с этими датами?
date -d '1916-07-03'
date -d '1930-06-21'
date -d '1981-04-01'
date -d '1982-04-01'
date -d '1983-04-01'
date -d '1984-04-01'
Как сделать генератор без таких ошибок, который работал бы с этими датами?
Ubuntu 20.04
Ответы (1 шт):
Почему в Bash возникают ошибки именно с этими датами?
- к программе bash перечисленное не имеет никакого отношения.
- перечисленное имеет отношение к программе date, которая берёт информацию из вашей операционной системы (подробнее см., например, в конце другого моего ответа)
$ date -d '1916-07-03'
если быть точным, то отсутствуют две секунды:
$ date -d '1916-07-03 00:00'
$ date -d '1916-07-03 00:01'
связано это, вероятно, с измененением поясного времени для москвы. в детали не вникал. вот комментарий из файла europe (из архива time zone database), который, возможно, проливает свет на это изменение:
# From Vladimir Karpinsky (2014-07-08):
# LMT in Moscow (before Jul 3, 1916) is 2:30:17, that was defined by Moscow
# Observatory (coordinates: 55° 45' 29.70", 37° 34' 05.30")....
# LMT in Moscow since Jul 3, 1916 is 2:31:01 as a result of new standard.
# (The info is from the book by Byalokoz ... p. 18.)
# The time in St. Petersburg as capital of Russia was defined by
# Pulkov observatory, near St. Petersburg. In 1916 LMT Moscow
# was synchronized with LMT St. Petersburg (+30 minutes), (Pulkov observatory
# coordinates: 59° 46' 18.70", 30° 19' 40.70") so 30° 19' 40.70" >
# 2h01m18.7s = 2:01:19. LMT Moscow = LMT St.Petersburg + 30m 2:01:19 + 0:30 =
# 2:31:19 ...
$ date -d '1930-06-21'
тут отсутствует ровно час с 00:00 и по 00:59.
связано с введением т.н. «декретного» времени:
Первый раз декретное время было введено 21 июня 1930 года в 00 часов 00 минут по местному времени (Постановление СНК СССР от 16.06.30г).
$ date -d '1981-04-01' $ date -d '1982-04-01' $ date -d '1983-04-01' $ date -d '1984-04-01'
тут тоже отсутствует ровно час с 00:00 и по 00:59 в каждый из указанных дней. причина — ввод (в 1981) и отмена (в 1984) т.н. «летнего» времени: 1 апреля часы переводились на один час вперёд, 1 октября — назад.
Как сделать генератор без таких ошибок, который работал бы с этими датами?
например, указывайте явно время (по умолчанию берётся 00:00), не затрагиваемое вышеперечисленными изменениями законодательства. например:
$ date -d '1916-07-03 12:00'
