Смотреть что такое "2038 год" в других словарях. Максимально понятный гид от Дениса Пешехонова

Для Windows 26.03.2019
STRRAVAGANZA про ПРИВЕТ С ТОГО СВЕТА (кстати, клевая идейка то было) и узнал, что существует проблема 2038 года. Помните, была проблема 2000 года , ее вроде удачно пережили.

А теперь вот это. Как оно пройдет? Опять все надуманно и раздувают на пустом месте? Вот вам про проблему подробнее …

Проблема 2038 года в вычислительной технике - ожидаемые сбои в программном обеспечении 19 января 2038 года. Данная проблема затрагивает программы и системы, в которых используется представление времени по стандарту POSIX (UNIX-время), которое представляет собой количество секунд, прошедшее с 1 января 1970 года. Такое представление времени - это стандарт для Unix-подобных операционных систем (из-за повсеместного использования языка Си).

В старых 32-битных системах (до середины 90-х) используется тип данных time_t для хранения секунд в виде signed int (32-битного целого со знаком). Самая поздняя дата, которая может быть представлена таким форматом в стандарте POSIX - это 03:14:07, вторник, 19 января 2038 года по Всемирному времени (UTC).

Более позднее время заставит такое поле данных стать отрицательным, как бы закольцевав таким образом время (поскольку отрицательное число может быть воспринято программами как время в 1970 или 1901 году, в зависимости от реализации). В результате могут быть произведены ошибочные вычисления или результаты.

Для проблемы 2038 года не существует простого решения для существующих комбинаций процессоров и операционных систем.

Изменение определения типа time_t на 64 бита нарушит бинарную совместимость программ, существующих хранимых данных и всего другого, использующего представление времени в бинарном виде. А приведение time_t в целое без знака может нарушить работу программ, которые вычисляют разницу во времени.

В большинстве операционных систем для 64-битных архитектур уже используется 64-битное представление целого в time_t . Переход на такие архитектуры уже происходит, и некоторые ожидают, что он будет завершён к 2038 году.

Тем не менее, сотни тысяч 32-битных систем всё ещё вводились в строй в 2010 году, в том числе и во встраиваемых системах. Вызывает сомнение, что они все будут заменены к 2038 году. Несмотря на то, что современные компьютерные системы могут модернизироваться раз в 18-24 месяцев (по «Закону Мура»), встроенные компьютеры могут действовать без модернизации весь срок, который работают системы, ими управляемые. Например, компьютеры управления процессами модели IBM 1800, выпуск которых был начат в 1965 году, всё ещё использовались на одной из атомных станций в Канаде в 2006 году.

В дополнение к этому, 32-битный формат time_t также включён в спецификации форматов файлов, таких как повсеместно распространённый архивный формат ZIP. Формат файла может существовать в течение времени, за которое сменятся многие поколения компьютеров, а это означает, что Проблема 2038 останется актуальной.

Введение 64-битного формата вносит новую дату «закольцовывания» - оно произойдёт примерно через 290 миллиардов лет (4 декабря 292 277 026 596 года в 15:30:08

Кстати, возвращаясь к теме поста про «привет из склепа» как то думал про то, что вот скоро начнет умирать активно поколение социальных сетей и интернет будет заполняться страницами людей, которые давно умерли. Т.е вот так через несколько поколений люди будут заходить к давно умершим в гости и смотреть какой фигней они страдали там в сетях. Самострели, приколы, фотки еды … Правнуки будут бродить по страницам прабабушек и прадедушек, а то и дальше?

Есть вариант конечно, что по сроку давности страницы будут удаляться. Почему не сделать услугу с предоплатой, чтобы страница жила в интернете вечно.

А жаль если удалят … я бы свои оставил. А вы?

Оригинал статьи находится на сайте ИнфоГлаз.рф Ссылка на статью, с которой сделана эта копия -

По аналогии с пугавшей человечество 15 лет назад «проблемой 2000 года» специалисты называют новую - «проблему 2038 года». Якобы 19 января этого года компьютеры, использующие распространённую сейчас систему исчисления времени, могут столкнуться с системной ошибкой: у них не найдётся числа, чтобы отобразить эту дату в двоичном коде. Однако есть основания считать, что к этому времени вопрос станет неактуальным из-за быстрого развития техники.

19 января 2038 года в 03:14:07 по Гринвичу компьютеры и другие устройства с 32-битной системой не смогут больше верно отсчитывать время. Такую новость обсуждают многие СМИ мира. Гипотетическую ситуацию, по примеру «проблемы 2000 года», когда ожидались возможные сбои из-за смены тысячелетия, назвали «проблемой 2038 года». Впрочем, она будет актуальна, только если к этому моменту ещё останутся компьютеры, использующие нынешний принцип отсчёта времени.

Не хватит цифр

Как поясняют специалисты, дело в том, что очень многие вычислительные устройства, в том числе использующие операционные системы Windows, Android, Macintosh, - отсчитывают системное время с 1 января 1970 года в секундах, используя 32-битное значение. 19 января 2038 года наступит момент, когда у них просто не найдётся числа, чтобы записать наступление 2 147 483 648-й секунды. И счётчик «обнулится» до 1970 или 1901 года, в зависимости от установок. Это может привести к системным ошибкам.

С подобной ситуацией уже столкнулся Google на своём сервисе YouTube. Проблему вызвало самое популярное видео в интернете - клип Gangnam Style южнокорейского исполнителя Psy. Когда количество его просмотров достигло 2 147 483 647, счётчик просто перестал работать. Программистам Google пришлось его переписывать. Починили с большим заделом - теперь допустимое количество просмотров составляет 9 223 372 036 854 775 808 (более 9 триллионов).

Насколько серьёзна проблема

Программисты знают о существующем ограничении 32-битных систем и готовятся к 2038 году. К примеру, введение 64-битного отсчёта времени в современных системах отодвигает «проблему 2038 года» сразу на 290 миллиардов лет. Но в мире остаётся ещё много 32-битных систем. К тому же, эта проблема таится ещё и во многих нынешних широко распространённых форматах файлов.

«Современные версии операционных систем решают эту проблемы переходом к 64-битной схеме отсчёта времени, но некоторые старые устройства, или те, на которых установлено старое програмное обеспечение, могут повести себя непредсказуемо», - отметил журналист издания The Economist Гленн Флейшман.

«На самом деле, решение заключается в том, что в течение 23 лет многие 32-битные системы устареют и будут подлежать замене. На смену им придут те, которым не потребуется исправление», - пишет The Guardian.

«Самой большой головной болью, видимо, станет модернизация оборудования, к примеру, на энергетических объектах. Но если планировать эту работу заранее, то можно избежать больших проблем», - отмечает издание.

Одно можно сказать определённо: у человечества достаточно времени, чтобы разобраться с этим вопросом. К тому же, «проблема 2000 года» в итоге так и не вызвала того, что многие предрекали. К примеру, массового отключения АЭС и падения самолётов.

19 января 2038 года в 03:14:07 по Всемирному времени, в приложениях, работающих под 32-битной версией PHP, может произойти сбой. В этот момент, стандартные функции работы с датой и временем перестанут корректно обрабатывать текущее время.

Все это связано с тем, что для представления даты и времени используется целое число. Данное число представляет собой количество секунд прошедших с начала эпохи UNIX, а именно с полночи 1 января 1970 года по Всемирному времени. В 32-битной версии PHP для хранения этого числа используется 32-битное целое со знаком. Максимально возможным значением для такого типа является 2 147 483 647, которое соответствует указанной критической дате.



Существует большая степень вероятности того, что к 2038 году все функционирующие системы и PHP-интерпретаторы будут 64-битные. Такое изменение, даст возможность беспрепятственно работать с датой примерно на 290 миллиардов лет вперед. Однако возникает сомнение, что это произойдет к 2038 году.

Еще одной проблемой 2038 года является невозможность работы с датами в прошлом и в будущем, уже сейчас. Под данное ограничение подпадают даты находящиеся до 1902 и после 2037 года.

Пути решения

Существует 2 способа решения данной проблемы:

  1. Не делать ничего, т.к. к 2038 году проблема будет решена естественным образом;
  2. Использовать встроенный класс «DateTime».

Первый способ полностью себя исчерпывает и, несмотря на свою простоту, является недальновидным.


Второй способ, напротив, имеет право на существование. О нем и пойдет речь далее.

Класс «DateTime»

Класс «DateTime», появившийся в PHP 5.2, призван полностью решить проблему 2038 года. Однако, программистам, привыкшим к стандартным функциям обработки даты и времени, работать с этим классом будет неудобно. Для ускорения процесса разработки приложений лучше всего использовать функции являющиеся интерфейсом к классу «DateTime».

Чтобы упростить жизнь программистов, я написал несколько аналогов часто используемых функций работы с датой и временем. Стоит заметить, что входные параметры и поведение функций не идентично встроенным аналогам.

Функция получения текущей метки времени Unix

// // Улучшенная функция «time» // (функция возвращает текущую метку времени) // function enhanced_time() { $DateTime_obj = new DateTime(); return $DateTime_obj->format("U"); }

Функции вывода даты и времени в определенном формате

// // Улучшенная функция «date» // (функция форматирует системную дату/время) // function enhanced_date($format_str, $timestamp = NULL, $timezone = NULL) { // // Явно объявить переменные // settype($format_str, "string"); // Формат, в котором следует выводить дату и время // // Если не указана метка времени - использовать текущую метку времени // if (is_null($timestamp)) { $timestamp = "now"; } else // Иначе - использовать переданную метку времени { $timestamp = "@" . number_format($timestamp, 0, ".", ""); } // // Если не указан часовой пояс - использовать часовой пояс по умолчанию // if (!is_string($timezone)) { $timezone = date_default_timezone_get(); } // // Создать экземпляр класса DateTime с необходимыми параметрами // $DateTime_obj = new DateTime($timestamp); $DateTime_obj->setTimezone(new DateTimeZone($timezone)); // // Вернуть дату и время в указанном формате // return $DateTime_obj->format($format_str); } // // Улучшенная функция «gmdate» // (функция форматирует системную дату/время по Гринвичу) // function enhanced_gmdate($format_str, $timestamp = NULL) { return enhanced_date($format_str, $timestamp, "UTC"); }

Функция получения информации о метке времени Unix

// // Улучшенная функция «getdate» // (функция возвращает информацию о дате/времени) // function enhanced_getdate($timestamp = NULL, $timezone = NULL) { // // Получить информации о дате/времени в виде неассоциативного массива // $arr = explode("=", enhanced_date("s=i=H=d=w=m=Y=z=l=F=U", $timestamp, $timezone)); // // Вернуть информацию о дате/времени в виде ассоциативного массива // return array("seconds" => (int) $arr, "minutes" => (int) $arr, "hours" => (int) $arr, "mday" => (int) $arr, "wday" => (int) $arr, "mon" => (int) $arr, "year" => (int) $arr, "yday" => (int) $arr, "weekday" => $arr, "month" => $arr, 0 => $arr); }

Функции формирования метки времени Unix для заданной даты и времени

// // Улучшенная функция «mktime» // (функция возвращает метку времени для заданной даты) // function enhanced_mktime($timezone = NULL, $hour = NULL, $minute = NULL, $second = NULL, $month = NULL, $day = NULL, $year = NULL) { // // Если не указан часовой пояс - использовать часовой пояс по умолчанию // if (!is_string($timezone)) { $timezone = date_default_timezone_get(); } // // Получить массив информации о времени по умолчанию // $default_datetime_arr = enhanced_getdate(NULL, $timezone); // // Заполнить значениями по умолчанию, параметры, которые не были переданы в функцию // if (is_null($hour)) { $hour = $default_datetime_arr["hours"]; } if (is_null($minute)) { $minute = $default_datetime_arr["minutes"]; } if (is_null($second)) { $second = $default_datetime_arr["seconds"]; } if (is_null($month)) { $month = $default_datetime_arr["mon"]; } if (is_null($day)) { $day = $default_datetime_arr["mday"]; } if (is_null($year)) { $year = $default_datetime_arr["year"]; } // // Изменить тип переменных при необходимости // settype($hour, "integer"); settype($minute, "integer"); settype($second, "integer"); settype($month, "integer"); settype($day, "integer"); settype($year, "integer"); // // Создать экземпляр класса DateTime с необходимыми параметрами // $DateTime_obj = new DateTime(); $DateTime_obj->setTimezone(new DateTimeZone($timezone)); $DateTime_obj->setDate($year, $month, $day); $DateTime_obj->setTime($hour, $minute, $second); // // Вернуть метку времени // return $DateTime_obj->format("U"); } // // Улучшенная функция «gmmktime» // (возвращает метку времени Unix для времени по Гринвичу) // function enhanced_gmmktime($hour = NULL, $minute = NULL, $second = NULL, $month = NULL, $day = NULL, $year = NULL) { return enhanced_mktime("UTC", $hour, $minute, $second, $month, $day, $year); }

Заключение

Не стоит забывать, что теперь, при использовании типичных функций, в обязательном порядке, следует указывать часовой пояс по умолчанию. Делать это необходимо следующим образом:


// // Установить часовой пояс по умолчанию // date_default_timezone_set("Asia/Bangkok");

Также приведу несколько вариантов применения указанных функций:


// // Получить и вывести текущую метку времени Unix // $timestamp_now = time(); echo $timestamp_now . "
"; $timestamp_now_e = enhanced_time(); echo $timestamp_now_e . "

"; // // Получить и вывести информацию о текущей метке времени Unix // echo "
";
var_dump(getdate($timestamp_now));
var_dump(enhanced_getdate($timestamp_now_e));
echo "
 ";

//
// Вывести текущую дату и время в указанном формате
echo date(«Y-m-d H:i:s», $timestamp_now). "
";
echo enhanced_date(«Y-m-d H:i:s», $timestamp_now_e). "

//
// Получить и вывести метку времени Unix для даты и времени в далеком будущем
$year = 2050;
$month = 3;
$day = 18;
$hour = 22;
$minute = 56;
$second = 53;

$timestamp_future = mktime($hour, $minute, $second, $month, $day, $year);
echo $timestamp_future. "
";

$timestamp_future_e = enhanced_mktime(NULL, $hour, $minute, $second, $month, $day, $year);
echo $timestamp_future_e. "

//
// Вывести дату и время в будущем в указанном формате
echo date(«Y-m-d H:i:s», «2531257013»). "
";
echo enhanced_date(«Y-m-d H:i:s», «2531257013»). "

Теги: PHP, проблема 2038 года, дата, время, класс DateTime

Максимально понятный гид от Дениса Пешехонова.

14 июля 2017 года в 5:40:00 по Москве произошло знаковое событие: UNIX-время было равно 1 500 000 000. Если бы я пил, предложил бы накатить по 150 за такое дело.

Разъяснение для неайтишников

Компьютерам нужно абсолютное время, которое не зависит от часовых поясов и способа записи, поэтому когда-то решили выражать его вот как: любой момент времени это такое число, сколько секунд прошло с момента [четверг, 01.01.1970 0:00:00 GMT+0] и до него. Если момент был раньше этой даты, то число отрицательное.

Подавляющее большинство программистов хотя бы иногда работают с UNIX-временем. Как правило, в таком виде удобно сохранять разные даты, а для просмотра человеком преобразовывать уже в нужный формат с учётом часового пояса и способа представления (например в США сначала пишут месяц, а потом день; в англоязычном мире распространён 12-часовой формат времени и так далее).


Важно понимать, что UNIX-время одинаковое в один и тот же момент для всех людей на планете. И для всех компьютеров на планете, что ещё важнее.

Только что прошло ровно полтора миллиарда секунд с полуночи (по Гринвичу) 1 января 1970 года. Каждые ~3 года проходит ещё сто миллионов секунд, и второй старший разряд увеличивается на единицу. А ровно два миллиарда будет аж в 2033 году, в среду 18-го мая в 6:33:20 по Москве.


Но есть ещё кое-что любопытное. Существует так называемая «Проблема 2038- го года».

Дело в том, что во многих компьютерах и прочих электронных устройствах, если говорить грубо, целые числа не могут быть больше, чем 2 147 483 647 (или 2^31-1) из-за некоторых технических особенностей.

Если в таком устройстве где-то хранится и используется время, то оно наверняка в UNIX-формате, а это значит, что самый поздний момент, который понимает такой компьютер – вторник, 19 января 2038 года в 3:14:07 GMT+0. Потому что в этот момент пройдёт ровно 2 147 483 647 секунд с начала отсчёта в 1970-м году.


Что же будет дальше?

Техника с этого момента будет жёстко глючить, потому что время в ней зациклено, и при достижении наибольшего допустимого значения оно переместится в наименьшее допустимое: пятница, 13 декабря 1901 года в 20:45:52. Что равно -2 147 483 648 или -2^31. Именно столько секунд прошло между этой датой и первым января 1970-го.

Что делать?

Как пользователь вы можете сделать только одно: не сидеть на старой технике и не использовать старые устройства и программы. А если вы кодер, то сами знаете: никаких int32 на таймстампы, ребята. Только long, Number, int64 или что там в вашем любимом языке.

В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете … Википедия

5798 (ивр. ? ??? ? , сокр.: ??? ??) год по еврейскому календарю начнётся накануне 10 сентября 2037 года и закончится 29 сентября 2038 года. В этом году 385 дней. Это високосный год еврейского календаря с двумя месяцами Адар Адар I и Адар II. Это… … Википедия

5799 (ивр. ? ??? ? , сокр.: ??? ??) год по еврейскому календарю начнётся накануне 30 сентября 2038 года и закончится 18 сентября 2039 года. В этом году 354 дня. Это обычный год еврейского календаря с одним месяцем Адар. Это третий год после года… … Википедия

Эта статья или часть статьи содержит информацию об ожидаемых событиях. Здесь описываются события, которые ещё не произошли … Википедия

Эта статья или часть статьи содержит информацию об ожидаемых событиях. Здесь описываются события, которые ещё не произошли … Википедия

Эта статья или часть статьи содержит информацию об ожидаемых событиях. Здесь описываются события, которые ещё не произошли … Википедия

Эта статья или часть статьи содержит информацию об ожидаемых событиях. Здесь описываются события, которые ещё не произошли … Википедия

Эта статья или часть статьи содержит информацию об ожидаемых событиях. Здесь описываются события, которые ещё не произошли … Википедия

Эта статья или часть статьи содержит информацию об ожидаемых событиях. Здесь описываются события, которые ещё не произошли … Википедия

Книги

  • Malefic Time Книга 1 Апокалипсис графический роман , Ройо Л., Ройо Р.. 2038 год. На руинах человеческой цивилизации хозяйничают древние и могущественные силы. Близится новая битва двух противостоящих начал. Это не первый их поединок. Принято думать, что исход…
  • Malefic Time. Часть 1. Апокалипсис , Ройо Луис. 2038 год. На руинах человеческой цивилизации хозяйничают древние и могущественные силы. Близится новая битва двух противостоящих начал. Это не первый их поединок. Принято думать, что исход…


Рекомендуем почитать

Наверх