Час із різних часових поясів з допомогою GNU date

  • 2013-02-15
  • (автор: yurb)

Сьогодні о 2-й годині дня за Новим Йорком NASA розпочнуть трансляцію, присвячену польоту астероїда 2012 DA14 біля нашої планети. На сайті NASA подано час "2 p.m. EST". Як дізнатись, яка це буде година в тому місці планети, де перебуваєте ви?

У кожній системі GNU/Linux (а також инших системах, якщо додатково заінсталювати) є команда date. Якщо просто відкрити термінал і запустити її, вона видасть вам поточну дату, день тижня, час і часовий пояс. Але це далеко не все, що вона вміє робити.

Чужий часовий пояс → ваш часовий пояс

Наприклад, можна легко з'ясувати, котра година буде у нас, коли в США буде «2 p.m. EST»:

$ date --date='2 p.m. EST'
п'ятниця, 15 лютого 2013 21:00:00 +0200

(Рядок, який починається знаком долара, позначає нашу команду, а те, що під ним — дані, які команда повертає. Знак долара у вікні теміналу означає, що термінал чекає на команди).

Команда date виявилась доволі кмітливою і розібрала, що́ означає «2 p.m. EST», а тоді повідомила, що в нашому часовому поясі цей момент часу настане о 21:00. Прапорець --date означає «покажи мені не поточний час, а той час, який мене цікавить», в нашому випадку — «з'ясуй, що таке 2 p.m. EST й покажи мені».

При тім варто мати на увазі, що буквені позначення часових поясів, як то EST чи EDT є недосконалими, бо часом одне й те ж буквене позначення може означати зовсім різні часові пояси. Наприклад, EST означає «східний часовий пояс» як для США, так і для Австралії, але це зовсім різні часові пояси в глобальному сенсі. Тому завжди безпечніше спершу впевнитись, який саме часовий пояс мають на увазі там, де написано EST (бо якщо виявиться, що йдеться про Австралію, а не про США, тоді це буде на 15 годин раніше — різниця суттєва), і тоді вказати його таким чином:

$ date --date='TZ="America/New_York" 2 p.m.'
п'ятниця, 15 лютого 2013 21:00:00 +0200

Погляньмо тепер, що ще цікавого вміє робити ця команда.

Ваш часовий пояс → чужий часовий пояс

Котра зараз година в Новому Йорку?

$ TZ="America/New_York" date
п'ятниця, 15 лютого 2013 08:42:09 -0500

Як бачимо, цього разу ми вказали значення змінної TZ перед запуском команди date. Річ у тім, що тут ми вказуємо її як змінну середовища — тобто вона існує поза командою date, і каже системі: "Я хочу бачити час за ново-йоркським часовим поясом".

Котра година буде в Новому Йорку, коли у вас буде 9 вечора?

$ TZ="America/New_York" date --date='TZ="Europe/Kiev" 21:00'
п'ятниця, 15 лютого 2013 14:00:00 -0500

В цьому прикладі ми вказали змінну TZ двічі. Перший раз — для системи, щоб вона знала, в якому часовому поясі ми хочемо бачити час, другий — власне для команди date, щоб вона розуміла, яку саме із 21-х годин ми маємо на увазі (адже ж система каже команді, що ми хочемо бачити час так, ніби перебуваємо Новому Йорку).

Перелік часових поясів, які розуміє ваша система, можна отримати, заглянувши в теку /usr/share/zoneinfo/.

Ще деякі фокуси

Ви хочете знати, який буде день від нині за 20 тисяч днів? Дуже просто:

$ date --date 'now + 20000 days'
субота, 19 листопада 2067 15:52:16 +0200

А за 20 тисяч годин?

$ date --date 'now + 20000 hours'
субота, 30 травня 2015 00:53:16 +0300

А який був день 10 років тому?

$ date --date 'now - 10 years'
субота, 15 лютого 2003 15:57:16 +0200

Отож, як бачимо, командний рядок може бути надзвичайно дієвою та корисною річчю, особливо якщо користуватись системами на основі GNU (наскільки мені відомо, команда date в инших unix’оподібних системах не має таких дивовижних умінь, як варіянт GNU). Більшість дистрибутивів Linux є системами GNU. Також ви можете отримати доступ до цієї та инших команд GNU на системах Windows, якщо заінсталюєте Cygwin. Існує також можливість інсталяції GNU coreutils (до яких належить вдосконалена версія date) на MacOS X.

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