Переклад дати в UNIX онлайн. Unix час та Unix Timestamp (MySQL, PHP, JavaScript). Коротка характеристика календарних типів MySQL

Що таке Unix час або Unix епоха (Unix epoch або Unix time або POSIX time або Unix timestamp)?

UNIX-час або POSIX-час (англ. Unix time) - спосіб кодування часу, прийнятий у UNIX та інших POSIX-сумісних операційних системах.
Моментом початку відліку вважається опівночі (за UTC) з 31 грудня 1969 року на 1 січня 1970, час відтоді називають "ерою UNIX" (англ. Unix Epoch).
Час UNIX узгоджується з UTC, зокрема, коли оголошення високосних секунд UTC відповідні номери секунд повторюються.
Спосіб зберігання часу у вигляді кількості секунд дуже зручно використовувати при порівнянні дат (з точністю до секунди), а також для зберігання дат: при необхідності їх можна перетворити в будь-який формат, що легко читати. Дата і час у цьому форматі також займають дуже мало місця (4 або 8 байтів, залежно від розміру машинного слова), тому його можна використовувати для зберігання великих обсягів дат. Недоліки у продуктивності можуть проявитися при дуже частому зверненні до елементів дати, на кшталт номера місяця тощо. Але найчастіше ефективніше зберігати час як однієї величини, а чи не набору полів.

Конвертування епохи Unix в людину зрозумілу дату (human readable date)


Unix дата початку та кінця року, місяця чи дня


Переклад секунд у дні, години та хвилини


Як отримати Unix час у...

Perltime
PHPtime()
RubyTime.now (або Time.new). Щоб вивести: Time.now.to_i
Pythonimport time спочатку, потім time.time()
Javalong epoch = System.currentTimeMillis()/1000;
Microsoft .NET C#epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", Now())
Erlangcalendar:datetime_to_gregorian_seconds(calendar:now_to_universal_time(now()))-719528*24*3600.
MySQLSELECT unix_timestamp(now())
PostgreSQLSELECT extract(epoch FROM now());
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScriptMath.round(new Date().getTime()/1000.0) getTime() повертає час у мілісекундах.
Unix/Linuxdate +%s
Інші OSКомандний рядок: perl -e "print time" (Якщо Perl встановлено на вашій системі)

Конвертування дати в Unix час у...

PHPmktime( годинник, хвилини, секунди, місяць, день, рік)
RubyTime.local( рік, місяць, день, годинник, хвилини, секунди, usec) (або Time.gm для GMT/UTC виведення). Щоб вивести додайте.to_i
Pythonimport time спочатку, потім int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S"))))
Javalong epoch = new java.text.SimpleDateFormat ("dd/MM/yyyy HH:mm:ss").parse("01/01/1970 1:00:00");
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", поле дати)
MySQLSELECT unix_timestamp( час) Формат часу: YYYY-MM-DD HH:MM:SS або YYMMDD або YYYYMMDD
PostgreSQLSELECT extract(epoch FROM date("2000-01-01 12:34"));
З timestamp: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08"); C інтервалом: SELECT EXTRACT(EPOCH FROM INTERVAL "5 days 3 hours");
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", поле з датою)
Unix/Linuxdate +%s -d"Jan 1, 1980 00:00:01"

Конвертування Unix часом у зрозумілу дату (human readable date).

PHPdate( Формат, unix час);
RubyTime.at( unix час)
Pythonimport time спочатку, потім time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( unix час)) Замініть time.localtime на time.gmtime для GMT дати.
JavaString date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date ( unix час*1000));
VBScript/ASPDateAdd("s", unix час, "01/01/1970 00:00:00")
PostgreSQLSELECT TIMESTAMP WITH TIME ZONE "epoch" + unix час* INTERVAL "1 second";
MySQLfrom_unixtime( unix час, не обов'язково, вихідний формат) Стандартний формат виходу YYY-MM-DD HH:MM:SS
SQL ServerDATEADD(s, unix час, "1970-01-01 00:00:00")
Microsoft Excel=(A1 / 86400) + 25569 Результат буде в GMT зоні часу. Для інших часових зон: =((A1 +/- різниця аремені для зони)/86400) + 25569.
Linuxdate -d @1190000000
Інші OSКомандний рядок: perl -e "print scalar(localtime( unix час))" (Якщо встановлено Perl) Замініть "localtime" на "gmtime" для GMT/UTC зони часу.

Для чого потрібний інструмент "Unixtime конвертер"?

Даний інструмент, в першу чергу, буде корисним веб-майстрам, які постійно мають справу з великими обсягами дат або часто у своїй роботі звертаються до їх елементів. За допомогою інструмента "Unixtime конвертер" можна легко конвертувати Unix час у зрозумілу для користувача дату (і навпаки), дізнатися про поточний Unix epoch час, а також отримати Unix час у різних мовах програмування, СУБД та операційних системах.

Що таке час Unix?

Епоха Unix (Unix epoch) почалася в ніч з 31 грудня 1969 року на 1 січня 1970 року. Саме цю дату взяли за точку відліку "комп'ютерного" часу, який обчислюється за секунди і займає дуже мало місця на диску - лише 4 або 8 байт. За допомогою такого способу кодування програмісти можуть "заховати" будь-яку дату в одне число і легко конвертувати його назад у зрозумілий користувачам формат.

Unix час (ще його називають Unix time або POSIX time) зручно використовувати у різних операційних системах та мовах програмування, оскільки воно відображається у вигляді однієї величини, а не певної кількості полів, що займають місце. До того ж, UNIX time повністю відповідає стандарту UTC (зокрема і високосних роках) – у разі відповідні значення секунд просто повторюються.

Термінологія Unix

Кілька слів про терміни.

Отже, Unix-часом(або POSIX-часом) вважається кількість секунд, які пройшли з півночі 1 січня 1970 року до теперішнього часу.

Unix Timestamp(тимчасова мітка) – це "зафіксований" час, інакше кажучи – конкретна дата, відображена в числі.

UTC(Universal Coordinated Time) – це Всесвітній координований час, який "фіксується" на нульовому меридіані і від якого ведеться відлік географічних часових поясів.

Наскільки "довговічна" ця система?

Лише через кілька десятків років, а саме 19 січня 2038 року о 03:14:08 за UTC Unix time досягне значення 2147483648, і комп'ютерні системи можуть інтерпретувати це число як негативне. Ключ до вирішення цієї проблеми полягає у використанні 64-бітної (замість 32-бітної) змінної для зберігання часу. У такому разі запасу числових значень Unix time вистачить людству ще на 292 мільярди років. Непогано, правда?

Unix час – один для всіх

Якщо ви живете в Лондоні або Сан-Франциско, а ваші друзі - в Москві, то "звірити годинник" можна за Unix time: ця система в даний момент єдина для всього світу. Звичайно, якщо час на серверах виставлено правильно. А за допомогою інструменту "Unixtime конвертер"така конвертація займе у вас частки секунди.

Unix Epoch).

Цілочисленне уявлення

Щодня число, що представляє 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 03: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 1073741824 = 2 30 (1 гібісекунда)
18 березня 2005 року , 01:58:31 UTC 1 111 111 111
6 вересня 2008 року 12:12:05 UTC 1 220 703 125 = 5 13
13 лютого 2009 року , 23:31:30 UTC 1 234 567 890

Проблема 2038 року

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

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

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

Програмна конвертація

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

Конвертація часу, заголовковий файл

typedef unsigned short u16_t; typedef unsigned long u32_t; typedef signed short s16_t; typedef signed long s32_t; // DEF: standard signed format // UNDEF: non-standard unsigned format #define _XT_SIGNED #ifdef _XT_SIGNED typedef s32_t xtime_t; #else typedef u32_t xtime_t; #endif struct tm ( /* date and time components */ BYTE tm_sec; BYTE tm_min; BYTE tm_hour; BYTE tm_mday; BYTE tm_mon; u16_t tm_year; ); void xttotm (struct tm * t, xtime_t secs); xtime_t xtmtot(struct tm *t);

Конвертація часу

#include "xtime.h" #define _TBIAS_DAYS ((70 * (u32_t)365) + 17) #define _TBIAS_SECS (_TBIAS_DAYS * (xtime_t)86400) #define _TBIAS_YEAR 1900 #define 03) ||((year) == 0)) ?mos: lmos) const s16_t lmos = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335); const s16_t mos = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334); #define Daysto32(year, mon) (((year - 1) / 4) + MONTAB(year)) //////////////////////////// ///////////////////////////////////////////// xtime_t xtmtot(struct tm *t ) ( /* convert time structure to scalar time */ s32_t days; xtime_t secs; s32_t mon, year; /* Calculate number of days. */ mon = t->tm_mon - 1; year = t->tm_year - _TBIAS_Y days = Daysto32(year, mon) - 1; days += 365 * year; days += t->tm_mday; days -= _TBIAS_DAYS; /* Calculate number of seconds. += 60 * t->tm_min; secs += t->tm_sec; secs += (days * (xtime_t)86400); //////////////////////////////////////////////////// //// void xttotm(struct tm *t, xtime_t secsarg) ( u32_t secs; s32_t days; s32_t mon; s32_t year; s32_t i; const s16_t* pm; u32_t)secsarg;days = _TBIAS_DAYS; ) else ( secs = (u32_t)secsarg + _TBIAS_SECS; days = 0; ) #else secs = secsarg; = secs/86400; secs = secs % 86 400; t->tm_hour = secs/3600; secs % = 3600; t->tm_min = secs/60; t->tm_sec = secs % 60; /* determine year */ for (year = days / 365; days< (i = Daysto32(year, 0) + 365*year);) { --year; } days -= i; t->tm_year = year + _TBIAS_YEAR; /* determine month */ pm = MONTAB(year); for (mon = 12; days< pm[--mon];); t->tm_mon = mon + 1; t->tm_mday = days - pm + 1; )

Конвертація часу з формату Excel у Unix

double et; // дата і час у форматі Excel (також використовується в OpenOffice, Sierra Chart); // дата та час у форматі Unix

Напишіть відгук про статтю "UNIX-час"

Примітки

Зовнішні посилання

Уривок, що характеризує UNIX-час

Чернишов сидів із книгою французького роману біля вікна першої кімнати. Кімната ця, мабуть, була насамперед залою; в ній ще стояв орган, на який навалені були якісь килими, і в одному кутку стояло складне ліжко ад'ютанта Бенігсена. Цей ад'ютант був тут. Він, мабуть, замучений гулянкою чи ділом, сидів на згорнутому ліжку і дрімав. Із зали вели дві двері: одна прямо до колишньої вітальні, інша праворуч до кабінету. З перших дверей чулися голоси тих, що розмовляли німецькою мовою і зрідка французькою. Там, у колишній вітальні, були зібрані, за бажанням государя, не військова рада (государ любив невизначеність), але деякі особи, яких думку про майбутні труднощі він хотів знати. Це не була військова рада, але як би рада обраних для з'ясування деяких питань особисто для государя. На цю півраду були запрошені: шведський генерал Армфельд, генерал ад'ютант Вольцоген, Вінцінгероде, якого Наполеон називав швидким французьким підданим, Мішо, Толь, зовсім не військова людина – граф Штейн і, нарешті, сам Пфуль, який, як чув князь Андрій, був la Cheville ouvriere [основою] всієї справи. Князь Андрій мав нагоду добре розглянути його, оскільки Пфуль невдовзі після нього приїхав і пройшов у вітальню, зупинившись на мить поговорити з Чернишевим.
Пфуль з першого погляду, у своєму російському генеральському погано пошитому мундирі, який нескладно, як на вбраному, сидів на ньому, здався князеві Андрієві ніби знайомим, хоча він ніколи не бачив його. У ньому був і Вейротер, і Мак, і Шмідт, і багато інших німецьких теоретиків генералів, яких князю Андрію вдалося бачити 1805 року; але він був типовіший за них. Такого німця теоретика, який поєднував у собі все, що було в тих німцях, ще ніколи не бачив князь Андрій.
Пфуль був невисокий на зріст, дуже худий, але широкий, грубого, здорового складання, з широким тазом і кістлявими лопатками. Обличчя його було дуже зморшкувате, з глибоко вставленими очима. Волосся його спереду біля скронь, очевидно, квапливо були пригладжені щіткою, ззаду наївно стирчали пензликами. Він, неспокійно й сердито оглядаючись, увійшов до кімнати, ніби він боявся у великій кімнаті, куди він увійшов. Він, незграбним рухом притримуючи шпагу, звернувся до Чернишова, питаючи німецькою, де государ. Йому, видно, якнайшвидше хотілося пройти кімнати, закінчити поклони та вітання і сісти за справу перед картою, де він почував себе на місці. Він квапливо кивав головою на слова Чернишова і іронічно посміхався, слухаючи його слова про те, що государ оглядає укріплення, які він, сам Пфуль, заклав за своєю теорією. Він щось басисто і круто, як кажуть самовпевнені німці, пробурчав про себе: Dummkopf… або: zu Grunde die ganze Geschichte… або: swird was gescheites d raus werden… [дурості… до біса вся справа… (нім.) ] Князь Андрій не почув і хотів пройти, але Чернишев познайомив князя Андрія з Пфулем, помітивши, що князь Андрій приїхав із Туреччини, де так щасливо скінчено війну. Пфуль трохи глянув не стільки на князя Андрія, скільки через нього, і сміючись промовив: «Da muss ein schoner taktischcr Krieg gewesen sein». [«То те, мабуть, правильно тактична була війна.» (нім.)] - І, засміявшись зневажливо, пройшов до кімнати, з якої чулися голоси.
Мабуть, Пфуль, уже завжди готовий на іронічне роздратування, нині був особливо збуджений тим, що насмілилися без нього оглядати табір і судити про нього. Князь Андрій за одним коротким цим побаченням із Пфулем завдяки своїм аустерлицьким спогадам склав собі ясну характеристику цієї людини. Пфуль був одним із тих безнадійно, незмінно, до мучеництва самовпевнених людей, якими тільки бувають німці, і саме тому, що тільки німці бувають самовпевненими на підставі абстрактної ідеї – науки, тобто уявного знання досконалої істини. Француз буває самовпевнений тому, що він вважає себе особисто, як розумом, так і тілом, непереборно чарівним як для чоловіків, так і для жінок. Англієць самовпевнений на тій підставі, що він є громадянин упорядкованої у світі держави, і тому, як англієць, знає завжди, що йому робити потрібно, і знає, що все, що він робить як англієць, безперечно добре. Італієць самовпевнений тому, що він схвильований і забуває легко себе і інших. Російський самовпевнений саме тому, що він нічого не знає і знати не хоче, тому що не вірить, щоб можна було цілком знати що-небудь. Німець самовпевнений найгірший, і твердіший за всіх, і противніший за всіх, тому що він уявляє, що знає істину, науку, яку він сам вигадав, але яка для нього є абсолютна істина. Такий, мабуть, був Пфуль. У нього була наука – теорія руху, виведена ним з історії воєн Фрідріха Великого, і все, що зустрічалося йому в новітній історії воєн Фрідріха Великого, і все, що зустрічалося йому в новій військовій історії, здавалося йому нісенітницею, варварством, потворним зіткненням, в якому з обох сторін було зроблено стільки помилок, що ці війни не могли бути названі війнами: вони не підходили під теорію і не могли служити предметом науки.
У 1806 році Пфуль був одним із упорядників плану війни, що закінчилася Єною і Ауерштетом; але в результаті цієї війни він не бачив жодного доказу неправильності своєї теорії. Навпаки, зроблені відступи від його теорії, за його поняттями, були єдиною причиною всієї невдачі, і він із властивою йому радісною іронією говорив: Ich sagte ja, dai die ganze Geschichte zum Teufel gehen wird. [Адже я ж говорив, що вся справа піде до біса (нім.)] Пфуль був один з тих теоретиків, які так люблять свою теорію, що забувають мету теорії - додаток її до практики; він у любові до теорії ненавидів будь-яку практику і знати її не хотів. Він навіть тішився неуспіхом, тому що неуспіх, що походив від відступу на практиці від теорії, доводив йому лише справедливість його теорії.
Він сказав кілька слів з князем Андрієм і Чернишевим про справжню війну з виразом людини, яка знає вперед, що все буде погано і навіть незадоволений цим. Непричесані пензлики волосся, що стирчали на потилиці, і квапливо прилизані скроні особливо красномовно підтверджували це.
Він пройшов до іншої кімнати, і звідти відразу ж почулися басисті і буркотливі звуки його голосу.

Не встиг князь Андрій проводити очима Пфуля, як у кімнату поспішно увійшов граф Бенігсен і, кивнувши головою Болконському, не зупиняючись, пройшов до кабінету, віддаючи якісь накази своєму ад'ютантові. Государ їхав за ним, і Бенігсен поспішив уперед, щоб приготувати щось і встигнути зустріти государя. Чернишов та князь Андрій вийшли на ганок. Государ зі стомленим виглядом злазив з коня. Маркіз Паулучі щось казав государю. Государ, схиливши голову ліворуч, із невдоволеним виглядом слухав Паулучі, який говорив із особливим жаром. Государ рушив уперед, мабуть, бажаючи закінчити розмову, але розчервонілий, схвильований італієць, забуваючи пристойності, йшов за ним, продовжуючи говорити:
— Що ж до того, хто порадив Дріський табір, — говорив Паулучі, тоді як государ, входячи на сходи і помітивши князя Андрія, вдивлявся в незнайоме йому обличчя. .

Цей інструмент потрібен для того, щоб перевести дату з формату Unix TimeStamp у зрозумілу людині дату і навпаки.

Що таке Unix час і навіщо його використовують?Щоб зрозуміти, для чого це використовується, почну з загального поняття, що ж таке Unix час.

Unix час (або TimeStamp, що в перекладі російською означає "позначка часу" і має той же сенс)- Це кількість секунд, що пройшли з 1 січня 1970 року. Тобто Unix TimeStamp на момент 01.01.1970 00:00:00 дорівнював 0. Через 2 хвилини (120 секунд) Unix-час дорівнював уже 120. Наприклад, цілодобово пізніше (02.01.1970 00:00:00) Unix час був і вже 86400, оскільки минуло 60*60*24=86400 секунд. Зараз Unix Time Stamp дорівнює вже 156 181 53 70 і число постійно зростає, тому що секунди постійно цокають.

Але навіщо ним користуватися?Вся справа в тому, що Unix TimeStamp зручно використовувати для зберігання та маніпуляції датою під час програмування. Не буду вдаватися в подробиці, але якщо коротко те, що число набагато зручніше вважати і порівнювати, ніж рядок з "лівими" символами. Саме тому більшість розробників використовують саме Unix TimeStamp для роботи з датою у своїх проектах і в базі даних ми часто в полі `date` бачимо одне дуже велике число, зовсім не схоже на дату.

Саме тут вам і знадобиться цей інструмент. З його допомогою ви зможете легко перевести це "велике число з бази даних" в людину зрозумілу дату. Крім цього, ви зможете навіть зробити навпаки і перетворити будь-яку дату на Unix TimeStamp. Ось такими можливостями наділений цей конвертер.

Проблема 2038 року

Як я вже й казав, число Unix TimeStampз кожною секундою стає більше на 1. Рано чи пізно має настати межа цього числа і буде це якраз у 2038 році. Вся справа в тому, що максимальним числом у поширених на початку 21 століття 32-бітових операційних системах є 2 31 . Саме цього числа і досягне Unix TimeStamp у 2038 році.

→ А вирішення цієї проблеми вже знайдено. Для того, щоб у 2038 році сайти не перестали коректно враховувати час, достатньо користуватися 64-бітною операційною системою на хостингу/VDS/виділеному сервері, а не 32-бітною. З потужностями комп'ютерів, що активно зростають, і зменшенням їх вартості все йде до того, що до 2038 року переважна більшість послуг у сфері надання простору під сайт будуть надаватися на основі 64-бітових ОС. До речі, у 64-бітній системі подібна проблема не торкнеться нас як мінімум 292 млрд років, чого цілком достатньо для того, щоб вважати проблему 2038 рокувирішеною.

Лише для читачів Lifeexample можна відкрити інтернет-магазин на Moguta.CMS зі знижкою в 15%

Unix час та Unix Timestamp (MySQL, PHP, JavaScript)

Здрастуйте, шановні читачі блогу , в цій статті, я хочу розповісти вам про те, що таке Unix часі Unix Timestamp. Часто програмісти поєднують ці поняття в одне, але це не зовсім правильно. Крім того, стаття містить багато корисних нотаток, на тему роботи з Unix Timestamp у PHP, MySQL та JavaScript.

Чому Unix час починається з 1 січня 1970 року

Вся справа в тому, що час Unix починає відлік епохи Unix, з випуску першої системи UNIX. Перша система подібного роду була створена в 1969 році, тому точкою відліку часу розробники прийняли дату з 1 січня 1970 опівночі по UTC ( Світовий координований час).

Давайте розберемося з тим, для чого потрібні Unix час і Unix Timestamp, а також дамо їм чіткі поняття.

Unix Timestamp– це мітка часу, яка є послідовністю символів, що відображають кількість секунд, що пройшли з 1 січня 1970 року.

Спробую навести приклад для роз'яснення різниці цих двох понять.

На час написання мною цього посту, Unix часбуло одно 1346765877 .

На час прочитання, Вами, цієї інформації, запис про час ( 1346765877 ) , вже є міткою Unix Timestamp! Конвертувавши дану мітку часу у вигляд, ми отримаємо дату 04-09-2012 і час 17:37:57 .

Відверто кажучи, особливого сенсу розділяти два поняття, на мій погляд, немає, але все ж таки корисно мати уявлення про те, що з-себе представляє Unix Time, а також корисно розуміти, що кількість максимально можливих секунд, що пройшли з 1970 року, має межу!

Кінець епохи Unix прийде 2038 року

Факт:максимальним двійковим числом у 32 бітних системах є число 01111111 11111111 11111111 11111111 , Перевівши його в десяткову систему, ми отримаємо число 2147483647.

19 січня 2038 рокуо 03:14:08 настане момент, коли кількість секунд, що минули з початку ери Unix, перевищить максимальне, доступне в 32 бітній системі, число = 2147483647. При переповненні розряду відбудеться скидання дати.

Перевірити цю теорію на наочному прикладі дуже просто:

  • Відкрийте стандартний калькулятор Windows, натисніть ALT+3 , цим ви переведете його в інженерний вигляд;
  • Встановіть 4 байтовий режим і десятковий тип введення;
  • Напишіть число 2147483647;

  • Зверніть увагу на подання числа в двійковій системі;
  • Додайте до одиницю;

  • Результатом додавання виявиться негативне число!

Якщо продовжити додавати одиницю, ми отримаємо циклічне замикання.

Саме таке кільцювання дат відбудеться з 19 січня 2038 року на всіх системах, що використовують 32 бітну архітектуру.

Насправді не варто засмучуватися, адже розробники обчислювальних систем все більше впроваджують 64 бітні архітектури у повсюдне використання. Віритимемо в те, що вони встигнуть до 2038 року.

Тепер поговоримо про використання unix timestamp у php, mysqlі навіть у javascript.

Робота з unix timestamp

Дуже важливим моментом, при роботі з unix timestamp у php або mysql є необхідність чіткого розуміти плюси та мінуси такого формату дати.

Наприклад, TIMESTAMPне вдасться використати для завдання історичних подій чи подій далекого майбутнього. Весь набір дат обмежений періодом з 1970 на початок 2038 року. Якщо встановити дату, що виходить за рамки 2038, вона буде неправильно інтерпретована 32 бітною системою.

Усвідомивши це обмеження, напрошується логічне питання: " Навіщо треба морочитися з поданням дати за секунди?"

Коли слід використовувати Unix Timestamp

Для представлення часу в звичайній для нас системі його вимірювання потрібно 8 байт, а для unix timestamp вдвічі менше - 4 байта.

Економія обсягу даних, як на мене, основний і незаперечний плюс у використанні Unix Time.

Крім того, є ряд корисних нюансів доступних при роботі з UNIX timestamp в mysql. А оскільки вся інформація повинна зберігатися на сервері баз даних, і він у свою чергу має ряд переваг при роботі з мітками Unix часу, то вибір у бік unix timestamp можна коректно обґрунтувати такими положеннями.

У MySQL передбачений відповідний тип даних Timestamp для роботи з форматом unix-часу, встановивши який ми одразу отримуємо корисну перевагу, перед стандартними форматами DATEі DATETIME. Перевага полягає в тому, що виконуючи операцію додавання нового запису до таблиці, стовпець із цим типом даних заповнюється автоматично. А це означає, що ми можемо заощадити не тільки на об'ємі даних, а й на процесорному часі веб-сервера.

Для підкріплення слова справою поставимо таке завдання: під час реєстрації нового користувача у системі, потрібно заносити дату його додавання до бази даних.

Якщо тип поля зберігає дату таблиці – DATETIME, то запит з PHP скрипта буде виглядати приблизно так:

Вигода очевидна!

Є й мінус: якщо полів типу TIMESTAMP кілька, автоматично оновлюється тільки перше.

Чи є сенс використовувати INT замість timestamp

Багато програмістів під час роботи з unix timestamp, використовують цілий формат int(11) . Це зовсім не раціональний підхід до питання, оскільки MySQL для типу timestamp передбачено безліч корисних функцій, що впливають на швидкість роботи з ним. Тому зберігаючи мітку часу в INT, ми позбавимо себе всілякої серверної підтримки цього формату. Це приблизно теж, що зберігати id в типі varchar(11) .

Проте є одне виправдання зберігання unix timestamp в INT. При перенесенні основи між різними СУБД, може виникнути конфлікт типів, тобто. Для однієї з СУБД тип timestamp може виявитися незнайомим. У цьому випадку використання int матиме перевагу, оскільки цей формат є у всіх СУБД.

Коротка характеристика календарних типів MySQL

TIMESTAMP- тип даних для зберігання дати та часу. Дані зберігаються у вигляді кількох секунд, що минули від початку «епохи Юнікса». Діапазон значень: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Займає 4 байти.

DATE- Тип даних для зберігання дати. Діапазон значень: 1000-01-01 – 9999-12-31. Займає 3 байти.

DATETIME- тип даних для зберігання дати та часу. Діапазон значень: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. Займає 8 байт і зберігається у вигляді числа YYYYMMDDHHMMSS.

YEAR- Тип даних для зберігання року. Діапазон значень: 1901 – 2155. Займає 1 байт.

TIME- Тип даних для зберігання часу. Діапазон значень: −828:59:59 - 828:59:59. Займає 3 байти.

Переказ дати в Unix

Настав час викласти кілька корисних функцій щодо переведення дати в unix timestampі назад з unix-timeу читабельну дату.

Як отримати поточний UNIX-час

  • PHP:

    time ();

  • JavaScript:

    Math.round (new Date(). getTime() / 1000.0);

  • MySQL:

    SELECT unix_timestamp(now() );

Т.к. вбудовані кошти в солярці відсутні, створюємо наступний скрипт: #!/bin/sh truss date 2>&1 |grep ^time |awk "(print $3;)" exit $? або nawk "BEGIN(print srand())" або на перлі: perl -e "print time, "\n";" дізнатися дату модифікації файлу: truss -v lstat -t lstat ls -l file.txt 2>&1 1>/dev/null | grep "mt\=\" | awk "(print $9;)"

Як отримати Unix час у...

Perl time
PHP time()
Ruby Time.now (або Time.new). Щоб вивести: Time.now.to_i
Python import time спочатку, потім time.time()
Java long epoch = System.currentTimeMillis()/1000;
Microsoft .NET C# epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", Now())
Erlang calendar:datetime_to_gregorian_seconds(calendar:now_to_universal_time(now()))-719528*24*3600.
MySQL SELECT unix_timestamp(now())
PostgreSQL SELECT extract(epoch FROM now());
SQL Server SELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScript Math.round(new Date().getTime()/1000.0) getTime() повертає час у мілісекундах.
Unix/Linux date +%s
Інші OS Командний рядок: perl -e "print time" (Якщо Perl встановлено на вашій системі)

Конвертування дати в Unix час у...
PHP mktime( годинник, хвилини, секунди, місяць, день, рік)
Ruby Time.local( рік, місяць, день, годинник, хвилини, секунди, usec) (або Time.gm для GMT/UTC виведення). Щоб вивести додайте.to_i
Python import time спочатку, потім int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S"))))
Java long epoch = new java.text.SimpleDateFormat ("dd/MM/yyyy HH:mm:ss").parse("01/01/1970 1:00:00");
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", поле дати)
MySQL SELECT unix_timestamp( час) Формат часу: YYYY-MM-DD HH:MM:SS або YYMMDD або YYYYMMDD
PostgreSQL SELECT extract(epoch FROM date("2000-01-01 12:34"));
З timestamp: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08"); C інтервалом: SELECT EXTRACT(EPOCH FROM INTERVAL "5 days 3 hours");
SQL Server SELECT DATEDIFF(s, "1970-01-01 00:00:00", поле з датою)
Unix/Linux date +%s -d"Jan 1, 1980 00:00:01"

Конвертування Unix часом у зрозумілу дату (human readable date).
PHP date( Формат, unix час);
Ruby Time.at( unix час)
Python import time спочатку, потім time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( unix час)) Замініть time.localtime на time.gmtime для GMT дати.
Java String date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date ( unix час*1000));
VBScript/ASP DateAdd("s", unix час, "01/01/1970 00:00:00")
PostgreSQL SELECT TIMESTAMP WITH TIME ZONE "epoch" + unix час* INTERVAL "1 second";
MySQL from_unixtime( unix час, не обов'язково, вихідний формат) Стандартний формат виходу YYY-MM-DD HH:MM:SS
SQL Server DATEADD(s, unix час, "1970-01-01 00:00:00")
Microsoft Excel =(A1 / 86400) + 25569 Результат буде в GMT зоні часу. Для інших часових зон: =((A1 +/- різниця аремені для зони)/86400) + 25569.
Linux date -d @1190000000
Інші OS Командний рядок: perl -e "print scalar(localtime( unix час))" (Якщо встановлено Perl) Замініть "localtime" на "gmtime" для GMT/UTC зони часу.