Unixtime часы. UNIX-время. Как получить Unix время в

Что такое 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 время в...

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 01: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 зоны времени.

Для чего нужен инструмент "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 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 равно уже 1566148027 и число постоянно растет, так как секунды постоянно тикают.

Но зачем им пользоваться? Все дело в том, что 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 года решенной.

UNIX-время или POSIX-время (англ. Unix time) - удобный способ кодирования времени, принятый за основной в UNIX и других POSIX-совместимых операционных системах.
Само время записывается в прошедших секундах от начала эры Unix (англ. Unix Epoch), которая началась в полночь (по UTC) с 31 декабря 1969 года на 1 января 1970г. Время Unix согласуется с UTC, в частности, при объявлении висококосных секунд UTC - соответствующие номера секунд повторяются.

Этот способ хранения поддерживается многими системами и является очень удобным, к примеру, сравнение дат происходит с точностью до секунды, а хранение является компактным и легко преобразуется в любой удобочитаемый формат. Конечно, существуют и недостатки, к примеру при частом обращении к элементам даты, вроде номера месяца и т.п. Однако, в большинстве случаев эффективность достигается за счёт хранения даты в виде одной величины, вместо набора полей.

Получение UnixTime в разной среде "обитания":

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 установлен на вашей системе)

Как конвертировать обычную дату в UnixTime?

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 01: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"

Конвертируем обратно, UnixTime секунды в понятную, человекочитаемую дату:

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 зоны времени.

По большей части информация стащена с:
  • UTC : время на нулевом меридиане называется Всемирное координированное время, Universal Coordinated Time. Несовпадение акронима было вызвано необходимостью универсальности его для всех языков.
  • GMT : ранее вместо UTC использовалось среднее время по Гринвичу (Greenwich Mean Time, GMT), так как нулевой меридиан был выбран так, чтобы проходить через Гринвичскую королевскую обсерваторию.
  • Прочие часовые пояса могут быть записаны как смещение от UTC. Например, Австралийское восточное стандартное время (EST) записывается как UTC+1000, то есть время 10:00 по UTC есть 20:00 по EST того же дня.
  • Летнее время не влияет на UTC. Это всего лишь политическое решение смены часового пояса (смещения от UTC). Например, GMT всё ещё используется: это британское национальное время зимой. Летом оно становится BST.
  • Високосные секунды : по международному соглашению, UTC держится в не более чем 0,9 секунды от физической реальности (UT1, которое измеряется по солнечному времени) путём введения «високосной секунды» в конце последней минуты года по UTC или последней минуты июня.
  • Високосные секунды не обязаны объявляться (астрономами) более чем за 6 месяцев до их введения. Это представляет собой проблему, если вам требуется какое-либо планирование с секундной точностью на протяжении более 6 месяцев.
  • Время Unix : измеряется количеством секунд, прошедших с «эпохи» (начало 1970 года по UTC). На время Unix не оказывают влияния часовые пояса или летнее время.
  • Согласно стандарту POSIX.1, для времени Unix предполагается обрабатывать високосную секунды путём повторения предыдущей секунды, например: 59.00 59.25 59.50 59.75 59.00 ← повтор 59.25 59.50 59.75 00.00 ← инкремент 00.25 Это компромисс: вы не можете как-либо выразить високосную секунду в ваших системных часах и ваше время гарантированно пойдёт в обратную сторону. С другой стороны, каждый день равен в точности 86 400 секундам, и вам не понадобится таблица всех прошлых и будущих високосных секунд для того, чтобы перевести Unix-время в удобную для человека форму часы-минуты-секунды.
  • Предполагается, что ntpd произведёт повтор после того, как получит «високосные биты» от вышестоящих серверов времени, но я также видел и то, как он не делает ничего: система переходит на одну секунуду в будущее, затем медленно сползает обратное на правильное время.

Что должен знать о времени каждый программист

  • Часовые пояса относятся к уровню презентации
    Большинство вашего кода не должно заниматься часовыми поясами или местным временем, оно должно передавать Unix-время как оно есть.
  • Когда измеряете время, измеряйте Unix-время. Это UTC. Его просто получить (системными функциями). Оно не имеет часовых поясов или летнего времени (и високосных секунд).
  • Когда храните время, храните Unix-время. Это одно число.
  • Если вы хотите сохранить время, пригодное для чтения человеком (например, в логах), постарайтесь сохранить его вместе с Unix-временем, а не вместо .
  • Когда отображаете время, всегда включайте в него смещение часового пояса. Формат времени без смещения бесполезен.
  • Системные часы не точны.
  • Вы в сети? Системные часы каждой другой машины не точны по-разному.
  • Системные часы могут, и будут, перепрыгивать вперёд и назад во времени из-за вещей, которые вне вашего контроля. Ваша программа должна быть разработана таким образом, чтобы пережить это.
  • Отношение количества секунд системных часов к количеству настоящих секунд - не точно и может меняться. В основном это зависит от температуры.
  • Не используйте слепо gettimeofday() . Если вам нужны монотонные (постоянно увеличивающиеся) часы, посмотрите на clock_gettime() . [Вариант для Java: вместо System.currentTimeMillis() используйте System.nanoTime() ]
  • ntpd может изменять системное время двумя способами:
    • Шаг: часы перескакивают вперёд или назад к правильному времени немедленно
    • Подкручивание: изменение частоты системных часов так, чтобы они медленно сдвигались в сторону правильного времени.
    Подкручивание более предпочтительно, потому что оно менее разрушительно, но полезно только для корректировки небольшой разницы.

Специальные случаи

  • Время проходит со скоростью одну секунду за секунду для всех наблюдателей. Частота удалённых часов по отношению к наблюдателю зависит от скорости и гравитации. Часы внутри спутников GPS регулируются для преодоления эффектов относительности.
  • MySQL хранит столбцы типа DATETIME в виде упакованных в числа значений «YYYYMMDD HHMMSS» Если вы озаботились хранением отметок времени, храните их как целое число и используйте для преобразования функции UNIX_TIMESTAMP() и FROM_UNIXTIME().