Время линукс конвертер. Что должен знать о времени каждый программист. Что такое 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 конвертер" такая конвертация займет у вас доли секунды.

Т.к. встроенные средства в солярке отсутствуют, создаем следующий скрипт: #!/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 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 зоны времени.

Только для читателей 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./p>

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() ) ;

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 1 073 741 824 = 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:00 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 MONTAB(year) ((((year) & 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_YEAR; days = Daysto32(year, mon) - 1; days += 365 * year; days += t->tm_mday; days -= _TBIAS_DAYS; /* Calculate number of seconds. */ secs = 3600 * t->tm_hour; secs += 60 * t->tm_min; secs += t->tm_sec; secs += (days * (xtime_t)86400); return (secs); } ///////////////////////////////////////////////////////////////////// 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; #ifdef _XT_SIGNED if (secsarg >= 0) { secs = (u32_t)secsarg; days = _TBIAS_DAYS; } else { secs = (u32_t)secsarg + _TBIAS_SECS; days = 0; } #else secs = secsarg; days = _TBIAS_DAYS; #endif /* days, hour, min, sec */ days += secs / 86400; secs = secs % 86400; 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) time_t ut = round((et * 86400) - 2209161600); // дата и время в формате Unix

Напишите отзыв о статье "UNIX-время"

Примечания

Внешние ссылки

Отрывок, характеризующий UNIX-время

Чернышев сидел с книгой французского романа у окна первой комнаты. Комната эта, вероятно, была прежде залой; в ней еще стоял орган, на который навалены были какие то ковры, и в одном углу стояла складная кровать адъютанта Бенигсена. Этот адъютант был тут. Он, видно, замученный пирушкой или делом, сидел на свернутой постеле и дремал. Из залы вели две двери: одна прямо в бывшую гостиную, другая направо в кабинет. Из первой двери слышались голоса разговаривающих по немецки и изредка по французски. Там, в бывшей гостиной, были собраны, по желанию государя, не военный совет (государь любил неопределенность), но некоторые лица, которых мнение о предстоящих затруднениях он желал знать. Это не был военный совет, но как бы совет избранных для уяснения некоторых вопросов лично для государя. На этот полусовет были приглашены: шведский генерал Армфельд, генерал адъютант Вольцоген, Винцингероде, которого Наполеон называл беглым французским подданным, Мишо, Толь, вовсе не военный человек – граф Штейн и, наконец, сам Пфуль, который, как слышал князь Андрей, был la cheville ouvriere [основою] всего дела. Князь Андрей имел случай хорошо рассмотреть его, так как Пфуль вскоре после него приехал и прошел в гостиную, остановившись на минуту поговорить с Чернышевым.
Пфуль с первого взгляда, в своем русском генеральском дурно сшитом мундире, который нескладно, как на наряженном, сидел на нем, показался князю Андрею как будто знакомым, хотя он никогда не видал его. В нем был и Вейротер, и Мак, и Шмидт, и много других немецких теоретиков генералов, которых князю Андрею удалось видеть в 1805 м году; но он был типичнее всех их. Такого немца теоретика, соединявшего в себе все, что было в тех немцах, еще никогда не видал князь Андрей.
Пфуль был невысок ростом, очень худ, но ширококост, грубого, здорового сложения, с широким тазом и костлявыми лопатками. Лицо у него было очень морщинисто, с глубоко вставленными глазами. Волоса его спереди у висков, очевидно, торопливо были приглажены щеткой, сзади наивно торчали кисточками. Он, беспокойно и сердито оглядываясь, вошел в комнату, как будто он всего боялся в большой комнате, куда он вошел. Он, неловким движением придерживая шпагу, обратился к Чернышеву, спрашивая по немецки, где государь. Ему, видно, как можно скорее хотелось пройти комнаты, окончить поклоны и приветствия и сесть за дело перед картой, где он чувствовал себя на месте. Он поспешно кивал головой на слова Чернышева и иронически улыбался, слушая его слова о том, что государь осматривает укрепления, которые он, сам Пфуль, заложил по своей теории. Он что то басисто и круто, как говорят самоуверенные немцы, проворчал про себя: Dummkopf… или: zu Grunde die ganze Geschichte… или: s"wird was gescheites d"raus werden… [глупости… к черту все дело… (нем.) ] Князь Андрей не расслышал и хотел пройти, но Чернышев познакомил князя Андрея с Пфулем, заметив, что князь Андрей приехал из Турции, где так счастливо кончена война. Пфуль чуть взглянул не столько на князя Андрея, сколько через него, и проговорил смеясь: «Da muss ein schoner taktischcr Krieg gewesen sein». [«То то, должно быть, правильно тактическая была война.» (нем.) ] – И, засмеявшись презрительно, прошел в комнату, из которой слышались голоса.
Видно, Пфуль, уже всегда готовый на ироническое раздражение, нынче был особенно возбужден тем, что осмелились без него осматривать его лагерь и судить о нем. Князь Андрей по одному короткому этому свиданию с Пфулем благодаря своим аустерлицким воспоминаниям составил себе ясную характеристику этого человека. Пфуль был один из тех безнадежно, неизменно, до мученичества самоуверенных людей, которыми только бывают немцы, и именно потому, что только немцы бывают самоуверенными на основании отвлеченной идеи – науки, то есть мнимого знания совершенной истины. Француз бывает самоуверен потому, что он почитает себя лично, как умом, так и телом, непреодолимо обворожительным как для мужчин, так и для женщин. Англичанин самоуверен на том основании, что он есть гражданин благоустроеннейшего в мире государства, и потому, как англичанин, знает всегда, что ему делать нужно, и знает, что все, что он делает как англичанин, несомненно хорошо. Итальянец самоуверен потому, что он взволнован и забывает легко и себя и других. Русский самоуверен именно потому, что он ничего не знает и знать не хочет, потому что не верит, чтобы можно было вполне знать что нибудь. Немец самоуверен хуже всех, и тверже всех, и противнее всех, потому что он воображает, что знает истину, науку, которую он сам выдумал, но которая для него есть абсолютная истина. Таков, очевидно, был Пфуль. У него была наука – теория облического движения, выведенная им из истории войн Фридриха Великого, и все, что встречалось ему в новейшей истории войн Фридриха Великого, и все, что встречалось ему в новейшей военной истории, казалось ему бессмыслицей, варварством, безобразным столкновением, в котором с обеих сторон было сделано столько ошибок, что войны эти не могли быть названы войнами: они не подходили под теорию и не могли служить предметом науки.
В 1806 м году Пфуль был одним из составителей плана войны, кончившейся Иеной и Ауерштетом; но в исходе этой войны он не видел ни малейшего доказательства неправильности своей теории. Напротив, сделанные отступления от его теории, по его понятиям, были единственной причиной всей неудачи, и он с свойственной ему радостной иронией говорил: «Ich sagte ja, daji die ganze Geschichte zum Teufel gehen wird». [Ведь я же говорил, что все дело пойдет к черту (нем.) ] Пфуль был один из тех теоретиков, которые так любят свою теорию, что забывают цель теории – приложение ее к практике; он в любви к теории ненавидел всякую практику и знать ее не хотел. Он даже радовался неуспеху, потому что неуспех, происходивший от отступления в практике от теории, доказывал ему только справедливость его теории.
Он сказал несколько слов с князем Андреем и Чернышевым о настоящей войне с выражением человека, который знает вперед, что все будет скверно и что даже не недоволен этим. Торчавшие на затылке непричесанные кисточки волос и торопливо прилизанные височки особенно красноречиво подтверждали это.
Он прошел в другую комнату, и оттуда тотчас же послышались басистые и ворчливые звуки его голоса.

Не успел князь Андрей проводить глазами Пфуля, как в комнату поспешно вошел граф Бенигсен и, кивнув головой Болконскому, не останавливаясь, прошел в кабинет, отдавая какие то приказания своему адъютанту. Государь ехал за ним, и Бенигсен поспешил вперед, чтобы приготовить кое что и успеть встретить государя. Чернышев и князь Андрей вышли на крыльцо. Государь с усталым видом слезал с лошади. Маркиз Паулучи что то говорил государю. Государь, склонив голову налево, с недовольным видом слушал Паулучи, говорившего с особенным жаром. Государь тронулся вперед, видимо, желая окончить разговор, но раскрасневшийся, взволнованный итальянец, забывая приличия, шел за ним, продолжая говорить:
– Quant a celui qui a conseille ce camp, le camp de Drissa, [Что же касается того, кто присоветовал Дрисский лагерь,] – говорил Паулучи, в то время как государь, входя на ступеньки и заметив князя Андрея, вглядывался в незнакомое ему лицо.

  • 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().