почему системное время Linux добавляет и вычитает один час каждые 6 месяцев? - PullRequest
1 голос
/ 27 июня 2019

При расчете количества секунд между двумя последовательными днями должно быть 86400 секунд (24 * 60 * 60).
Но два раза в год это не так ...
Один раз в день 23 часа, а через 6 месяцев - 25 часов.
Почему это происходит?

Я запустил код для проверки количества секунд между 2 днями с 2005 по 2019 год. и весь год там ровно 24 часа, кроме 2-х дней, где есть 23 и 25. Почему это происходит? Вот краткое изложение моих результатов - Столбец разницы - это количество секунд между этим днем ​​и предыдущим до 86400 секунд

+------------+------------+-------------------+
|   dates    | difference | number_of_seconds |
+------------+------------+-------------------+
| 2005-04-02 |       3600 |             82800 |
| 2005-10-10 |      -3600 |             90000 |
| 2006-04-01 |       3600 |             82800 |
| 2006-10-02 |      -3600 |             90000 |
| 2007-03-31 |       3600 |             82800 |
| 2007-09-17 |      -3600 |             90000 |
| 2008-03-29 |       3600 |             82800 |
| 2008-10-06 |      -3600 |             90000 |
| 2009-03-28 |       3600 |             82800 |
| 2009-09-28 |      -3600 |             90000 |
| 2010-03-27 |       3600 |             82800 |
| 2010-09-13 |      -3600 |             90000 |
| 2011-04-02 |       3600 |             82800 |
| 2011-10-03 |      -3600 |             90000 |
| 2012-03-31 |       3600 |             82800 |
| 2012-09-24 |      -3600 |             90000 |
| 2013-03-30 |       3600 |             82800 |
| 2013-10-28 |      -3600 |             90000 |
| 2014-03-29 |       3600 |             82800 |
| 2014-10-27 |      -3600 |             90000 |
| 2015-03-28 |       3600 |             82800 |
| 2015-10-26 |      -3600 |             90000 |
| 2016-03-26 |       3600 |             82800 |
| 2016-10-31 |      -3600 |             90000 |
| 2017-03-25 |       3600 |             82800 |
| 2017-10-30 |      -3600 |             90000 |
| 2018-03-24 |       3600 |             82800 |
| 2018-10-29 |      -3600 |             90000 |
+------------+------------+-------------------+

Вот пример кода, который я запустил внутри моего полного кода -

echo $((($(date +%s --date 2006-03-31)-$(date +%s --date 2006-03-30))))
echo $((($(date +%s --date 2006-04-01)-$(date +%s --date 2006-03-31))))
echo $((($(date +%s --date 2006-04-02)-$(date +%s --date 2006-04-01))))

1 Ответ

4 голосов
/ 27 июня 2019

Команда date в формате% s дает вам время настенных часов в секундах с начала эпохи, а ваше местоположение имеет летнее время. Поэтому, когда вы переходите на летнее время и обратно, вы либо набираете, либо теряете час.

...