Эпоха (информатика)
Эпоха – фиксированное время и дата, используемые в качестве точки отсчёта компьютерного системного времени. Большинство компьютерных систем определяют время как число, представляющее количество секунд, прошедших с определённой произвольной даты и времени. Например, Unix и POSIX измеряют время как число секунд, прошедших с 1 января 1970 года 00:00:00 UT, точки во времени, известной как эпоха Unix. C# и системы Windows NT, включая Windows 11 и Windows Server 2022, измеряют время как число 100-наносекундных интервалов, прошедших с 00:00:00UTC 1 января 1 года нашей эры и 1601 года нашей эры соответственно, что делает эти моменты времени эпохами для данных систем[1][2]. Эпохи в вычислениях почти всегда опредлеляются как полночь по всемирному времени в определённую дату.
Точность и представление
Системы учёта времени в программном обеспечении значительно различаются по точности измерения времени. Некоторые системы могут использовать в качестве единицы времени день, другие могут использовать наносекунды. Например, для эпохи, начинающейся в полночь по всемирному времени (UTC 00:00:00) 1 января 1900 года, и точности до секунды, время в полночь 24:00:00 1 января 1900 года будет представлено числом 86400, количеством секунд за день. Если нужно представить данные до начала эпохи, обычно используется та же система, но с отрицательными числами.
Такое представление времени в основном предназначено для внутреннего использования. В системах, где дата и время имеют значение для человека, программное обеспечение почти всегда преобразует это внутреннее число в дату и время, соответствующие человеческому календарю.
Проблемы
Компьютеры обычно не хранят числа произвольной длины. Вместо этого каждому числу, сохраняемому компьютером, выделяется фиксированный объем памяти. Следовательно, когда количество единиц времени, прошедших с момента начала отсчета системы (эпохи), превышает максимальное число, которое может поместиться в отведенном для представления времени пространстве, происходит переполнение и могут начаться проблемы. В то время как поведение системы после переполнения не обязательно будет предсказуемым, в большинстве систем время будет обнулено и компьютерная система будет считать, что эпоха началась (вновь).
Наиболее известной проблемой стала проблема 2000 года, возникшая в системах, которые отсчитывали время как число лет с начала эпохи 1 января 1900 года, и имели ограниченное пространство для хранения чисел от 0 до 99. Эти системы (если не были исправлены заранее) интерпретировали бы дату 1 января 2000 как 1 января 1900 года, что привело бы к непредсказыемым ошибкам в начале 2000 года.
Даже системы, которые выделяют больше места для хранения времени не имеют иммунитета к такого рода ошибкам. Многие Unix-подобные операционные системы, хранящие время в секундах от начала эпохи 1 января 1970 года и выделяющие достаточно места для хранения чисел вплоть до 2 147 483 647, столкнутся с проблемой переполнения 19 января 2038 года. Это известно как проблема 2038 года.
Существуют и другие, более тонкие проблемы, связанные со временем, такие как учёт дополнительных секунд, которые появляются непредсказуемо и нерегулярно. Кроме тогоy, приложения, которым необходимо представлять исторические даты и время (например, представлять даты до перехода с юлианского календаря на григорианский) должны использовать специализированные библиотеки работы со временем.
Наконец, некоторые программные продукты должны поддерживать совместимость с более старыми продуктами, которые не хранили время в строгом соответствии с традиционными системами отсчёта времени. Например, Microsoft Excel учитывает несуществующую дату 29 февраля 1900 года для сохранения совместимости с ошибками в старых версиях Lotus 1-2-3[3]. Lotus 1-2-3 учитывал эту дату из-за ошибки. К тому времени, когда ошибка была обнаружена, исправить её было уже поздно — «изменение сейчас нарушило бы формулы, которые были написаны с учётом этой аномалии»[4]. .
В спутниковых системах времени
Имеется как минимум шесть систем спутниковой навигации, все они работают, передавая сигналы времени. Из двух спутниковых систем с глобальным покрытием, GPS рассчитывает свой сигнал от эпохи, в то время как GLONASS вычисляет врем как смещение от UTC, причём входные данные UTC корректируются на дополнительные секунды. Из двух других систем, претендующих на глобальное покрытие, Galileo вычисляет время от эпохи, а Бэйдоу вычисляет как смещение от UTC без поправки на дополнительные секунды[5]. GPS передаёт также смещение между временем UTC и временем GPS и должен обновлять это смещение каждый раз, кода добавляется дополнительная секунда, что требует от GPS-приёмных устройств правильной обработки этого обновления. В отличие от этого, для пользователей ГЛОНАСС дополнительные секунды незаметны. Сложности расчета UTC от эпохи объясняются Европейским космическим агентством в документации Galileo в разделе «Уравнения для коррекции системного времени до эталонного времени»[6].
Знаменательные даты эпох в вычислительной технике
В следующей таблице приведены эпохи, используемые популярным программным обеспечением и другими компьютеризированными системами. Время в этих системах хранится как количество определённой единицы времени (дней, секунд, наносекунд и т. д.), прошедшее с указанного момента времени (обычно полночь по всемирному времени) для указанной даты.
| Дата эпохи | Заметные применения | Обоснование выбора |
|---|---|---|
| 0 января 1 до нашей эры[nb 1] | MATLAB[7] | "Год 0" в ISO 8601 |
| 1 января 1 года НЭ[nb 1] | .NET[2][8] Go[9], REXX[10], Rata Die [4] | Наша эра, ISO 2014 [11], RFC 3339[12] |
| 14 октября 1582 года | SPSS[13], IBM z/OS Языковая среда[14], IBM AIX COBOL [15] | То же, что и ниже, но с индексацией с единицы |
| 15 октября 1582 года | UUID version 1 | Дата григорианской реформы христианского календаря[16]. |
| 1 января 1601 года | NTFS, COBOL[17], Win32/Win64 (эпоха NT)[18][19] | 1601 год был первым годом 400-летнего цикла григорианского календаря во время создания Windows NT[18]. |
| 31 декабря 1840 года | Язык программирования MUMPS | 1841 год был невисокосным, за несколько лет до года рождения старейшего гражданина США, когда был разработан язык[20]. |
| 17 ноября 1858 гда | TENEX[21], VMS, Военно-морская обсерватория США, DVB SI 16-битное представление дней, другие вычисления, связанные с астрономией[22] | 17 ноября 1858, 00:00:00 UT является началом отсчёта модифицированного юлианского дня, эквивалентному юлианскому дню 2400000,5[23] |
| 10 мая 1869 года | PHAMIS дата, используемая в продуктах Lastword/Carecast/Centricity Enterprise, работающих с электронными медицинскими картами на серверах Tandem/NonStop | Дата золотого костыля на трансконтинентальной железной дороге, когда Центральная Тихоокеанская железная дорога и Union Pacific наконец встретились в Промонтори (Юта) в мае 1869 года. |
| 30 декабря 1899 года | Microsoft COM DATE, Object Pascal, LibreOffice Calc, Google Sheets[24] | Внутреннее значение, используемое в Microsoft Excel для совместимости с Lotus 1-2-3[3]. |
| 31 декабря 1899 года | Dyalog APL[25], Microsoft C/C++ 7.0[26] | Дата выбрана так, что по модулю 7 дата будет давать 0=воскресенье, 1=понедельник, 2=вторник, 3=среда, 4=четверг, 5=пятница и 6=суббота. Последняя версия не-Visual C/C++ от Microsoft использовала это, но впоследствии было внесено обратное изменение. |
| 0 января 1900 года | Microsoft Excel[3], Lotus 1-2-3[27] | Хотя логически дата 0 января 1900 года эквивалентна 31 декабря 1899, эти системы не позволяют пользователю задать 31 декабря 1899. Поскольку 1900 ошибочно считается високосным, в этих системах 0 January 1900 фактически соответствует исторической дате 30 декабря 1899 года. |
| 1 января 1900 года | Network Time Protocol, Time Protocol, CICS[28][29][30], Операционные системы IBM от MVS до z/OS, Mathematica, RISC OS, VME, Common Lisp, Michigan Terminal System | |
| 1 января 1901 года | Ada[31] | В первой версии языка диапазон дат был ограничен 1901-2099 годами, чтобы избежать лет, на которые влияло правило високосного года каждые 400 лет. Когда верхняя граница была расширена в более поздних версиях, нижняя граница осталась той же самой, чтобы обеспечить обратную совместимость с системами, которые использовали её как точку отсчёта[31]. |
| 1 января 1904 года | LabVIEW, Apple Inc.'s Классическая Mac OS, JMP Scripting Language, Palm OS, MP4, Microsoft Excel (опционально)[32], IGOR Pro | 1904 год является первым високосным годом 20-го века[33]. |
| 1 января 1960 года | SAS System[34] | |
| 31 декабря 1967 года | Pick OS и варианты (jBASE, Universe, Unidata, Revelation, Reality) | Дата выбрана так, что по модулю 7 дата будет давать 0=воскресенье, 1=понедельник, 2=вторник, 3=среда, 4=четверг, 5=пятница и 6=суббота[35]. |
| 1 января 1970 | Эпоха Unix используемая в стандарте времени POSIX, применяется в Unix и Unix-подобных системах (Linux, macOS, Android), а также в языках программирования: большинство реализаций C/C++[36], Java, JavaScript, Perl, PHP, Python, Ruby, Tcl, ActionScript. Также используется протоколом Precision Time Protocol. | |
| 1 января 1978 года | AmigaOS[37][nb 2]. Аппаратные системы Commodore Amiga были представлены в период с 1985 по 1994 год. Последняя версия ОС 4.1 (декабрь 2016 г.). AROS, MorphOS. | |
| 1 января 1980 года | IBM BIOS INT 1Ah, Файловые системы DOS, OS/2, FAT12, FAT16, FAT32, exFAT, ZIP формат и производные | IBM PC с его BIOS, а также 86-DOS, MS-DOS и PC DOS с файловой системой FAT12 были разработаны и представлены между 1980 и 1981 годами. |
| 6 января 1980 года | Qualcomm BREW, GPS, ATSC 32-битное время | GPS считает недели (неделя определяется как начинающаяся в воскресенье) и 6 января является первым воскресеньем в 1980 году[38][39]. Недели хранятся в 10-битном поле и первое GPS переполнение числа недель произошло в августе 1999. |
| 31 декабря 1989 года | Garmin FIT эпоха[40]. Стандарт, разработанный Garmin как часть их FIT протокола, который был принят многими как де-факто стандарт в индустрии фитнес-устройств[41]. | |
| 1 января 2000 года | AppleSingle, AppleDouble[42], PostgreSQL[43],[nb 3] Zigbee UTCTime[44], Ingenuity helicopter[45], GameCube[46] | Эта эпоха Y2K[47] используется иногда, чтобы сдвинуть проблему 2038 года на 2068 год, если процессор не поддерживает 64-битные операции. |
| 1 января 2001 года | NSDate в фреймворке Cocoa от Apple, NeXTSTEP | Первый день третьего тысячелетия нашей эры. |
| 1 января 2005 года | дата по умолчанию как стартовая точка Bada OS от Samsung на Samsung Wave и Samsung Wave II (не Android) Bada OS основана на Linux | первый день 2005 года. |
См. также
Примечания
- ↑ 1 2 Пролептический григорианский календарь.
- ↑ AmigaOS measures time in seconds and stores it in a signed 32-bit integer. After 19 January 2046, 03:14:07 the date will be negative. Latest OS version 4.1 (2016) has no fix for this.
- ↑ Имейте в виду, что функция Epoch возвращает Unix эпоху SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '1970-01-01 00:00:00-00'); returns 0.
- ↑ [MS-DTYP]: FILETIME. Microsoft Docs (30 марта 2020).
- ↑ 1 2 GregorianCalendar Class. MSDN. Дата обращения: 26 апреля 2015. (Remarks)
- ↑ 1 2 3 Joel Spolsky. Why are the Microsoft Office file formats so complicated? (And some workarounds) (19 февраля 2008). Дата обращения: 8 марта 2009.
- ↑ 1 2 Dershowitz, Reingold, 2008, с. xxi, xxvi.
- ↑ Hern?ndez-Pajares, M.; Subirana, J. Sanz; Zornoza, J. M. Juan. Time References in GNSS. gssc.esa.int/navipedia. European Space Agency (2011).
- ↑ GNSS Timescale Description Galileo. United Nations Office for Outer Space Affairs (2016). Section 5d
- ↑ "datenum", MathWorks, accessed 7 July 2015.
- ↑ "DateTimeOffset Structure" (.NET Framework 4.5), MSDN, 2015.
- ↑ Package time. golang.org. Дата обращения: 26 апреля 2015.
- ↑ Date—z/OS TSO/E REXX Reference. IBM.com. IBM (2014). (id=SA32-0972-00)
- ↑ Cowlishaw, 1990, с. 93, 177.
- ↑ Go 1 Release Notes—Major changes to the library—Time. golang.org (28 марта 2012). Дата обращения: 26 апреля 2015.
- ↑ Date and Time Formats. IBM.com. IBM. Дата обращения: 24 января 2020.
- ↑ CEEDATM—Convert seconds to character timestamp. z/OS Language Environment Programming Reference. IBM (22 марта 2021).
- ↑ AIX-COBOL, 2015.
- ↑ Salz, R.; Leach, P.; Mealling, M. RFC 4122: Proposed Standard: A Universally Unique IDentifier (UUID) URN Namespace. tools.ietf.org. Internet Engineering Task Force (июль 2005).
- ↑ ISO/IEC 1989:2014 - Information technology — Programming languages, their environments and system software interfaces — Programming language COBOL. — ISO, 2014. — С. 634. (csnumber=51416)
- ↑ 1 2 Raymond Chen. Why is the Win32 epoch January 1, 1601? The Old New Thing. MSDN Blogs (6 марта 2009).
- ↑ FILETIME structure (minwinbase.h). Microsoft Docs.
- ↑ What happened in 1841? M Technology and MUMPS Language FAQ, Part 1/2. Дата обращения: 14 августа 2015. Архивировано из оригинала 28 августа 2015 года.
- ↑ Raytheon, 1973, с. 7.
- ↑ Gernot M. R. Winkler. Modified Julian Date. U.S. Naval Observatory. Дата обращения: 29 января 2015. Архивировано из оригинала 14 февраля 2013 года.
- ↑ VMS base time origin. vms.tuwien.ac.at/info/humour. Technische Universit?t Wien. Архивировано из оригинала 6 июня 2007 года.
- ↑ Introduction to the Google Sheets API. Google Developers.
- ↑ International Day Number (брит. англ.). help.dyalog.com. Дата обращения: 27 ноября 2018.
- ↑ Time Management. msdn.microsoft.com.
- ↑ What is story behind December 30, 1899 as base date? social.msdn.microsoft.com. (недоступная ссылка)
- ↑ IBM z/OS, 1974, с. 38,97,186,241,259.
- ↑ IBM iSeries, 1998, с. 327,362.
- ↑ IBM TXSeries, 1999, с. 37,104.
- ↑ 1 2 John Barnes. Rationale for Ada 2005: 7.3 Times and dates. Ada Resource Association.
- ↑ Dates And Times In Excel. cpearson.com.
- ↑ MacTech – The journal of Apple technology. mactech.com.
- ↑ Introduction to Dates and Times in SAS.
- ↑ Mark Pick, International Spectrum Conference April 2010.
- ↑ time_t – C++ Reference. Дата обращения: 6 апреля 2015.
- ↑ Olaf Barthel. File: The Year 2000 Problem and the Amiga. amiga.de (сентябрь 1998).
- ↑ Levine, 2002, с. 1119.
- ↑ Time Systems and Dates – GPS Time. Department of Oceanography, NPS. Naval Postgraduate School, Oceanography Department. Дата обращения: 18 февраля 2019. Архивировано из оригинала 2 января 2019 года.
- ↑ FIT SDK - Working with Date Time Values. garmin.com (1 января 2023). Дата обращения: 25 февраля 2023.
- ↑ Flexible and Interoperable Data Transfer - FIT Protocol. garmin.com (1 марта 2019). Дата обращения: 25 февраля 2023.
- ↑ AppleSingle/AppleDouble Formats for Foreign Files Developer's Note. Дата обращения: 23 октября 2007. Архивировано из оригинала 17 июля 2011 года.
- ↑ PostgreSQL 9.1.24 Documentation. Chapter 8: Data Types. 8.5. Date/Time Types. PostgreSQL.org (27 октября 2016). — «Note: When timestamp values are stored as eight-byte integers (currently the default), microsecond precision is available over the full range of values. […] timestamp values are stored as seconds before or after midnight 2000-01-01.»
- ↑ ZigBee Cluster Library Specification. (Section 2.5.2.21 UTCTime)
- ↑ NASA JPL [@NASAJPL] (4 мая 2021). The Force is strong with this little one (Твит) — Твиттер.
- ↑ Yet Another Gamecube Documentation. www.gc-forever.com. Дата обращения: 30 июня 2025.
- ↑ NeoGPS/src/NeoTime.cpp at master · SlashDevin/NeoGPS (англ.). GitHub. Дата обращения: 5 ноября 2023.
Литература
- TENEX JSYS Manual. — BBN, 1973.
- CICS Transaction Server for z/OS 5.6 API Reference. — IBM, 1974.
- CICS for iSeries Application Programming Guide Version 5. — IBM, 1998.
- CICS Application Programming Reference Version 5.0. — IBM, 1999.
- Nachum Dershowitz, Edward Reingold. Calendrical Calculations. — 3. — Cambridge University Press]], 2008. — ISBN 978-0-521-70238-6.
- Mike Frederic Cowlishaw. The Rexx Language: A Practical Approach to Programming. — 2. — Prentice Hall, 1990. — ISBN 0-13-780651-5.
- CEEDATE—convert Lilian date to character format // COBOL for AIX Programming Guide Version 5.1. — First. — IBM, 2015.
- Judah Levine. Time and frequency distribution using satellites // Reports on Progress in Physics. — 2002. — Июль (т. 65, № 8). — doi:10.1088/0034-4885/65/8/201. — Bibcode:2002RPPh...65.1119L.National Institute of Standards and Technology (NIST)
Ссылки
- Critical and Significant Dates (J. R. Stockton), an extensive list of dates that are problematic for various operating systems and computing devices.
- Potential problem dates for computers (pdf) A list of potential problem dates for computers and software from 2001 to 2100 (IET).