Проблема високосного года
Проблема високосного года (также известная как ошибка високосного года или ошибка високосного дня ) — это проблема как для цифровой (связанной с компьютером), так и для нецифровой документации и ситуаций хранения данных, возникающая в результате ошибок при расчете того, какие годы являются високосными. лет или от манипулирования датами без учета разницы между високосными и обычными годами.
Категории
[ редактировать ]Ошибки високосного года обычно делятся на две категории в зависимости от степени влияния, которое они могут оказать при реальном использовании: [1]
- Те, которые приводят к ошибкам, например исключения, коды возврата ошибок, неинициализированные переменные или бесконечные циклы.
- Те, которые приводят к неверным данным, например проблемы отклонения на единицу в запросах диапазона или агрегации.
Примеры
[ редактировать ]Питон
[ редактировать ]Следующий код Python является примером ошибки високосного года категории 1. Он будет работать правильно до тех пор, пока today
становится 29 февраля. Затем он попытается создать 29 февраля не високосного года, которого не существует. date
конструктор поднимет ValueError
с сообщением «день выходит за пределы диапазона месяца». [2]
from datetime import date
today = date.today()
later = today.replace(year = today.year + 1)
Windows С++
[ редактировать ]Следующий код Windows C++ является примером ошибки високосного года категории 1. Он будет работать корректно до тех пор, пока текущей датой не станет 29 февраля високосного года. Затем он изменит st
для обозначения 29 февраля обычного года, даты, которой на самом деле не существует. Прохождение st
к любой функции, которая принимает SYSTEMTIME
struct в качестве параметра, скорее всего, потерпит неудачу.
Например, SystemTimeToFileTime
вызов, показанный здесь, вернет код ошибки. Поскольку это возвращаемое значение не отмечено (что встречается очень часто), это приведет к ft
остается неинициализированным. [3]
SYSTEMTIME st;
FILETIME ft;
GetSystemTime(&st);
st.wYear++;
SystemTimeToFileTime(&st, &ft);
Microsoft С#
[ редактировать ]Следующий код .NET C# является примером ошибки високосного года категории 1. Он будет работать правильно до тех пор, пока dt
становится 29 февраля. Затем он попытается создать 29 февраля не високосного года, которого не существует. DateTime
конструктор выдаст ArgumentOutOfRangeException
. [4]
DateTime dt = DateTime.Now;
DateTime result = new DateTime(dt.Year + 1, dt.Month, dt.Day);
JavaScript
[ редактировать ]Следующий код JavaScript является примером ошибки високосного года категории 2. Он будет работать правильно до тех пор, пока dt
становится 29 февраля, например, 29 февраля 2020 г. Затем он попытается установить 2021 год. Поскольку 29 февраля 2021 г. не существует, Date
Объект будет перенесен на следующую действительную дату, то есть 01.03.2021. [5]
var dt = new Date();
dt.setFullYear(dt.getFullYear() + 1);
Плохой алгоритм високосного года (много языков)
[ редактировать ]Следующий код представляет собой пример ошибки високосного года, которая встречается во многих языках. Это может привести к воздействию категории 1 или категории 2, в зависимости от того, для чего используется результат. Он ошибочно предполагает, что високосный год наступает ровно раз в четыре года. [6]
bool isLeapYear = year % 4 == 0;
Правильный алгоритм високосного года описан в разделе «Алгоритм високосного года» .
События
[ редактировать ]- Microsoft Excel , начиная с самых ранних версий, ошибочно считал 1900 год високосным, и поэтому 29 февраля приходится на период между 28 февраля и 1 марта этого года. Ошибка возникла в Lotus 1-2-3 и была намеренно реализована в Excel с целью обеспечения обратной совместимости . Microsoft написала статью об этой ошибке, объясняющую причины, по которым 1900 год считается високосным. [7] Эта ошибка стала требованием спецификации Ecma Office Open XML (OOXML). [8] [9]
- В 1996 году, 31 декабря, на двух алюминиевых заводах в Тивай-Пойнт , Новая Зеландия, и Белл-Бэй , Тасмания, Австралия, каждый из 660 компьютеров, управляющих плавильными линиями, отключился в полночь, поскольку компьютеры не были запрограммированы на обработку 366-го дня. года. Затраты на ремонт оценивались более чем в 1 миллион новозеландских долларов . [10]
- В 2000 году, 31 декабря, в Норвегии национальная железнодорожная компания Vy обнаружила, что все 29 ее новых поездов Signatur не ходят, потому что их бортовые компьютеры не распознали дату как 366-й день года. В качестве временной меры инженеры возобновили движение поездов, переведя часы на месяц назад. [11] [12] [13]
- В полночь 31 декабря 2008 года многие [14] первого поколения Модели Zune 30 зависли. [15] [16] Microsoft заявила, что проблема была вызвана внутренним драйвером часов, написанным Freescale , и тем, как устройство обрабатывает високосный год. Оно автоматически исправилось через 24 часа, но промежуточным «исправлением» для тех, кто не хотел ждать, было разрядить батарею устройства, а затем перезарядить ее после полудня по всемирному координированному времени 1 января 2009 года. [17] [18]
- от Sony PlayStation 3 неправильно считала 2010 год високосным, поэтому несуществующее 29 февраля 2010 года было показано 1 марта 2010 года, что вызвало программную ошибку . [19]
- В 2012 году спутниковые навигационные устройства TomTom вышли из строя из-за ошибки високосного года, которая впервые появилась 31 марта. [20]
- В 2012 году в истории чатов Gmail , была указана дата 31 декабря 1969 года для всех чатов, сохраненных 29 февраля . [ нужна ссылка ]
- В 2012 году Microsoft Azure была отключена от сети из-за ошибки високосного года 28 февраля. В 17:45 по тихоокеанскому стандартному времени команде Windows Azure стало известно о проблеме, по-видимому, из-за неправильного расчета времени для високосного года.
- В 2016 году большое количество ошибок високосного года было занесено в список ошибок високосного дня 2016 года на веб-сайте Code of Matt . [21]
- В 2016 году из-за ошибки високосного года в системе конвейера багажа в аэропорту Дюссельдорфа 29 февраля более 1200 единиц багажа пропустили свои рейсы. [22]
- В 2020 году большое количество ошибок високосного года было занесено в список ошибок високосного дня 2020 года на веб-сайте Code of Matt . [23]
- В 2024 году большое количество ошибок високосного года было занесено в список ошибок високосного дня 2024 года на веб-сайте Code of Matt . [24]
- В 2024 году из-за ошибки високосного года в автоматах самообслуживания заправочные станции с оплатой на заправке в Новой Зеландии отключились более чем на 10 часов. [25]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Джонсон-Пинт, Мэтт. «Каковы примеры ошибок високосного года?» . Переполнение стека . Проверено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт. «Питон — Замена года» . Переполнение стека . Проверено 29 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт. «Манипулирование структурой SystemTIME в Win32/C++» . Переполнение стека . Проверено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт. «.NET/C# — Построение из частей данных» . Переполнение стека . Проверено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт. «JavaScript — Добавление года(ов)» . Переполнение стека . Проверено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт. «Определение того, является ли год високосным» . Переполнение стека . Проверено 5 февраля 2020 г.
- ^ Excel ошибочно предполагает, что 1900 год — високосный . Проверено 1 мая 2019 г.
- ^ Стандарт ECMA-376/форматы файлов Open Office XML . Проверено 10 сентября 2016 г.
- ^ ISO/IEC 29500/Форматы файлов Open Office XML . Проверено 10 сентября 2016 г.
- ^ Таулер, Джим (7 января 1997 г.). «Ошибка в программном обеспечении високосного года приводит к «сбою на миллион долларов» » . Дайджест РИСКИ . 18 (74). Комитет ACM по компьютерам и государственной политике . Проверено 5 февраля 2020 г.
- ^ «Последний укус жука» . Новости Би-би-си . 5 января 2001 г.
- ^ «Системы 7-Eleven столкнулись с проблемой, похожей на 2000 год» . Проверено 10 марта 2023 г.
- ^ «Ошибка Y2K поразила норвежскую железную дорогу в конце года» . 1 января 2001 года . Проверено 10 марта 2023 г.
- ^ «Главная — Ответы Microsoft» . Форумы.zune.net. Архивировано из оригинала 30 августа 2009 года . Проверено 27 июля 2011 г.
- ^ Джон Херрман (31 декабря 2008 г.). «Zunes на 30 ГБ выходит из строя везде и сразу» . Gizmodo.com . Проверено 27 июля 2011 г.
- ^ Гир, Дункан (31 декабря 2008 г.). «СРОЧНО: Zunes по всему миру пострадала от загадочной аварии: Tech Digest» . Techdigest.tv . Проверено 27 июля 2011 г.
- ^ «Часто задаваемые вопросы по Zune 30» . Майкрософт . 31 декабря 2008. Архивировано из оригинала 2 января 2009 года . Проверено 1 января 2009 г.
- ^ Задеган, Брайант (3 января 2009 г.). «Урок бесконечных циклов» . АэроЭкспериенс . Проверено 5 января 2009 г.
- ^ «Sony исправляет ошибку високосного года на PS3» . Метро . 2 марта 2010 г. Проверено 10 октября 2019 г.
- ^ «Устройства спутниковой навигации TomTom столкнулись с «ошибкой високосного года» GPS » . Новости Би-би-си . 3 апреля 2012 года . Проверено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт (29 февраля 2016 г.). «Список ошибок високосного дня 2016» . Кодекс Мэтта . Проверено 5 февраля 2020 г.
- ^ «Из-за сбоя в аэропорту сотни пассажиров остались без штанов» . Местный (де) . Март 2016 года . Проверено 5 февраля 2020 г.
- ^ Джонсон-Пинт, Мэтт (29 февраля 2020 г.). «Список ошибок високосного дня 2020 года» . Кодекс Мэтта . Проверено 9 марта 2020 г.
- ^ «Список ошибок високосного дня 2024 года» . Кодекс Мэтта . 29 февраля 2024 г. Проверено 29 февраля 2024 г.
- ^ «Подача бензина возобновилась после однодневного отключения, причиной которого является сбой в високосный год» . Вестник Новой Зеландии . 01.03.2024 . Проверено 29 февраля 2024 г.