Чому існує різниця у даті Unix між 2 та 3 місяцями


16

Як це можливо і як я маю справу з цим? Я створюю сценарій резервного копіювання, який залежить від Unix dateі виявив цікаву помилку:

[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun  1 00:08:50 CEST 2014

Чи може це бути високосний рік / 29 лютого? Навряд чи в такому інструменті, як date
Марк Хендерсон

Відповіді:


44

Ви бачите таку поведінку через літній час (літній час).

Тому що ви зараз перебуваєте в літньому часі, де ваш годинник на одну годину вперед, коли ви запитуєте на три місяці тому о півночі першого червня, час закінчується на одну годину "раніше", оскільки це не був літній час три місяців тому.

Документація про дату GNU пропонує вирішити цю проблему, використовуючи 12:00 полудня та 15 числа місяця як вихідні пункти, коли запитують відносні дні або місяці відповідно. Наприклад:

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"

Дякую. Так, саме "3 місяці тому", що приходять о 01 ранку:[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago' 14-03-01 [root@web000c zfs_test]# date Sun Jun 1 01:00:15 CEST 2014
Ширкер

До! Я думаю, що мені потрібно розібратися в деяких моїх сценаріях, тому що я підозрюю, що я пропустив цю пропозицію щодо dateвикористання.
Калеб

14

Якщо абсолютний термін - це ваша головна проблема, можливо, найкраще відпрацювати UTC, оскільки він існує для цієї мети. Відповідь Майкла дуже корисна, коли вам доводиться працювати над проблемою, але зазвичай це гарна ідея уникати її повністю там, де ви можете.

Якщо ваша система за замовчуванням не встановлена ​​на UTC, найпростіший спосіб передати часовий пояс - це префіксація вашої команди TZзмінною оточення. Це обмежує перемикач зони на одну команду і запобігає проникненню змінної у наступні команди.

$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014

Що ви не повинні робити, це експортувати TZзмінну, оскільки це може зробити речі дуже заплутаними для усунення несправностей, як показано нижче.

$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014

-3

У цей конкретний рік, коли ваш комп’ютер вважає, що ним керують, і в конкретну дату, яку ви вибрали для тесту "1 місяць тому, 2 місяці тому і 3 місяці тому, так - це, швидше за все, виявлення 29 лютого. Не завжди помилка, але ..

Тепер, сьогодні НЕ 2014-06-01. Спробуйте ще раз. Встановіть дату комп’ютера на 2013-06-01. Спробуйте ще раз.
Встановіть дату комп’ютера на 2014-09-01. Спробуйте ще раз.


6
Якщо ви надаєте дати в американському MDYформаті, просто використовуйте /es для розділення. Ще краще, оскільки ми тут міжнародна спільнота, використовуйте належні дати ISO, такі як 2014-09-01.
glglgl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.