Ошибка при генерации определенных дат

Генерирую список дат в определенном диапазоне.

Код из файла 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 шт):

Автор решения: aleksandr barakin

Почему в Bash возникают ошибки именно с этими датами?

  1. к программе bash перечисленное не имеет никакого отношения.
  2. перечисленное имеет отношение к программе 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'
→ Ссылка