Час Unix

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Час Unix подолав відмітку в 1,000,000,000 секунд в 2001-09-09T01:46:40Z. Це було відсвятковано в Копенгагені, на вечірці Датської групи користувачів UNIX d 03:46:40 за локальним часом.

Час Unix чи час POSIX — система для опису моментів в часі, кількістю секунд які пройшли від початку епохи (півночі за всесвітнім координованим часом в четвер, першого січня, 1970-того року). (Час Unix означений в давніші моменти, але він є від'ємним). Додаткові секунди оголошені Міжнародною службою обертання землі та систем відліку не враховуються бо не є детермінованими. Широко використовується в Unix-подібних та багатьох інших операційних системах, платформах та файлових форматах. Час Unix на деяких можна отримати за допомогою команди date +%s.

Поточний UNIX-час: 1481308502 (18:35, 9 грудня 2016 UTC)
(Вище вказано час останньої генерації цієї сторінки.)

Цілочисельне уявлення[ред.ред. код]

UNIX-час представлений ​​цілим числом, яке збільшується з кожною минулої секундою без необхідності обчислень для визначення року, місяця, дня, години або хвилини для зручності сприйняття людиною. Сучаснйи UNIX-час узгоджується з UTC — відлік відбувається в секундах СІ. Часовий проміжок одного дня майже завжди розбитий на 86400 секунд, але при оголошенні високосних секунд становить 86401 секунду. Такі секунди, згідно із Всесвітнім часом, зберігають тривалість днів синхронізовану з часом обороту планети. В UNIX-часу відповідні номери секунд повторюються, тобто високосні секунди не враховуються.

У момент часу 00:00:00 UTC + 1 січня 1970 (вівторок) UNIX-час дорівнює нулю. Починаючи з цього часу, число зростає на певну кількість щодня. Таким чином, наприклад, 16 вересня 2004 року в 00:00:00, через 12677 днів після початку відліку UNIX-часу, час буде представлено числом 12677 × 86400 = 1095292800. Розрахунки можуть бути також зроблені в зворотному напрямку використовуючи негативні числа. Наприклад, дата 4 жовтня 1957 року 00:00:00, а це 4472 дня до початку відліку представлена ​​в UNIX-часу числом -4472 × 86400 = -386 380 800.[1]

Кожного дня число, яке представляє Unix-час обчислюється описаним чином в UTC (00: 00: 00Z), і збільшується рівно на 1 в секунду, починаючи з півночі. Отже, 16-09-2004 17: 55: 43.54, 64543.54 секунд з півночі, з прикладу вище, буде представлено в UNIX-часу числом 1095292800 + 64543.54 = 1095357343.54. Для дат, що передували початку відліку, число також зростає, тобто з плином часу наближається до нуля.

Використовувану цілочисльну систему зручно використовувати для порівняння та зберігання дат (дата і час в цьому форматі займають всього 4 або 8 байт). При необхідності звернення до елементів дат (день, місяць, рік) секунди можна перетворити в будь-який відповідний формат (і навпаки).

У програмах для зберігання UNIX-часу використовується цілочисельний знаковий тип. 32-бітові числа зі знаком можуть посилатися на моменти часу від п'ятниці 13 грудня 1901 року 20:45:52 до Вівторок 19 січня 2038 року 3:14:07 включно.

Щоб дізнатися поточний UNIX-час в більшості UNIX-подібних систем, можна використовувати команду date +% s.

«Ювілейні» значення[ред.ред. код]

Час Кількість секунд
13 грудня 1901 року, 20:45:52 UTC Мінімальна дата в знаковому 32-біт представленні (0x80000000)
19 січня 2038 року, 03:14:07 UTC Максимальна дата в знаковому 32-біт представленні (0x7FFFFFFF)
9 вересня 2001 року, 01:46:40 UTC 1 000 000 000 (1 гігасекунда)
10 січня 2004 року, 13:37:04 UTC 1 073 741 824 = 230 (1 гібісекунда)
18 березня 2005 року, 01:58:31 UTC 1 111 111 111
6 вересня 2008 року 12:12:05 UTC 1 220 703 125 = 513
13 лютого 2009 року, 23:31:30 UTC 1 234 567 890

Проблема Apple iOS як UNIX системи[ред.ред. код]

У 64-бітних iOS пристроїв від Apple існує проблема UNIX системи. Якщо перевести час на пристрої з 64-бітовим процесором під управлінням iOS на годину ночі першого січня 1970 року і перезавантажити пристрій, будучи в часовому поясі від UTC +1: 30 і більше, то після перезавантаження пристрою воно не включатиметься, весь час буде світитися «біле яблуко».

Відбувається це через різницю в часових поясах, тобто: якщо перевести час на 1:00 1 січня 1970 року в часовому поясі UTC +1: 30 або більше, то лічильник UNIX-time йде в мінус, так як відлік ведеться від UTC часу, що система зрозуміти не в змозі, внаслідок чого лічильник зависає. Пристрій навіть не відновлюється через DFU, але проблема має три рішення іншими способами. Перший спосіб: просто залишити включеним пристрій і чекати поки лічильник UNIX-time піде в плюс (поки не доведено, що даний спосіб працює). Другий спосіб: чекати поки акумулятор телефону сяде повністю і лічильник сам скинеться на нульовий стан. Третій спосіб: розібрати пристрій і відключити акумулятор на деякий час, потім зібрати пристрій, лічильник так само скинеться на нуль і пристрій буде працювати.

Проблема остаточно вирішена в iOS 9.3.1 — тепер на пристрої доступні для установки дати починаючи з 1 січня 2001 року.[2]

Програмна конвертація[ред.ред. код]

Наводиться приклад реалізації на мові Сі функцій конвертації між UNIX-часом і звичайною виставою у вигляді дати і часу доби. Приклад наведено в стандартному знаковому 32-біт форматі. Однак, якщо закомментировать визначення _XT_SIGNED, приклад збереться в беззнакову варіанті.

Посилання[ред.ред. код]