Эпоха (информатика)

Эпоха – фиксированное время и дата, используемые в качестве точки отсчёта компьютерного системного времени. Большинство компьютерных систем определяют время как число, представляющее количество секунд, прошедших с определённой произвольной даты и времени. Например, 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. 1 2 Пролептический григорианский календарь.
  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.
  3. Имейте в виду, что функция Epoch возвращает Unix эпоху SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '1970-01-01 00:00:00-00'); returns 0.
  1. [MS-DTYP]: FILETIME. Microsoft Docs (30 марта 2020).
  2. 1 2 GregorianCalendar Class. MSDN. Дата обращения: 26 апреля 2015. (Remarks)
  3. 1 2 3 Joel Spolsky. Why are the Microsoft Office file formats so complicated? (And some workarounds) (19 февраля 2008). Дата обращения: 8 марта 2009.
  4. 1 2 Dershowitz, Reingold, 2008, с. xxi, xxvi.
  5. Hern?ndez-Pajares, M.; Subirana, J. Sanz; Zornoza, J. M. Juan. Time References in GNSS. gssc.esa.int/navipedia. European Space Agency (2011).
  6. GNSS Timescale Description Galileo. United Nations Office for Outer Space Affairs (2016). Section 5d
  7. "datenum", MathWorks, accessed 7 July 2015.
  8. "DateTimeOffset Structure" (.NET Framework 4.5), MSDN, 2015.
  9. Package time. golang.org. Дата обращения: 26 апреля 2015.
  10. Date—z/OS TSO/E REXX Reference. IBM.com. IBM (2014). (id=SA32-0972-00)
  11. Cowlishaw, 1990, с. 93, 177.
  12. Go 1 Release Notes—Major changes to the library—Time. golang.org (28 марта 2012). Дата обращения: 26 апреля 2015.
  13. Date and Time Formats. IBM.com. IBM. Дата обращения: 24 января 2020.
  14. CEEDATM—Convert seconds to character timestamp. z/OS Language Environment Programming Reference. IBM (22 марта 2021).
  15. AIX-COBOL, 2015.
  16. 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).
  17. ISO/IEC 1989:2014 - Information technology — Programming languages, their environments and system software interfaces — Programming language COBOL. — ISO, 2014. — С. 634. (csnumber=51416)
  18. 1 2 Raymond Chen. Why is the Win32 epoch January 1, 1601? The Old New Thing. MSDN Blogs (6 марта 2009).
  19. FILETIME structure (minwinbase.h). Microsoft Docs.
  20. What happened in 1841? M Technology and MUMPS Language FAQ, Part 1/2. Дата обращения: 14 августа 2015. Архивировано из оригинала 28 августа 2015 года.
  21. Raytheon, 1973, с. 7.
  22. Gernot M. R. Winkler. Modified Julian Date. U.S. Naval Observatory. Дата обращения: 29 января 2015. Архивировано из оригинала 14 февраля 2013 года.
  23. VMS base time origin. vms.tuwien.ac.at/info/humour. Technische Universit?t Wien. Архивировано из оригинала 6 июня 2007 года.
  24. Introduction to the Google Sheets API. Google Developers.
  25. International Day Number (брит. англ.). help.dyalog.com. Дата обращения: 27 ноября 2018.
  26. Time Management. msdn.microsoft.com.
  27. What is story behind December 30, 1899 as base date? social.msdn.microsoft.com. (недоступная ссылка)
  28. IBM z/OS, 1974, с. 38,97,186,241,259.
  29. IBM iSeries, 1998, с. 327,362.
  30. IBM TXSeries, 1999, с. 37,104.
  31. 1 2 John Barnes. Rationale for Ada 2005: 7.3 Times and dates. Ada Resource Association.
  32. Dates And Times In Excel. cpearson.com.
  33. MacTech – The journal of Apple technology. mactech.com.
  34. Introduction to Dates and Times in SAS.
  35. Mark Pick, International Spectrum Conference April 2010.
  36. time_t – C++ Reference. Дата обращения: 6 апреля 2015.
  37. Olaf Barthel. File: The Year 2000 Problem and the Amiga. amiga.de (сентябрь 1998).
  38. Levine, 2002, с. 1119.
  39. Time Systems and Dates – GPS Time. Department of Oceanography, NPS. Naval Postgraduate School, Oceanography Department. Дата обращения: 18 февраля 2019. Архивировано из оригинала 2 января 2019 года.
  40. FIT SDK - Working with Date Time Values. garmin.com (1 января 2023). Дата обращения: 25 февраля 2023.
  41. Flexible and Interoperable Data Transfer - FIT Protocol. garmin.com (1 марта 2019). Дата обращения: 25 февраля 2023.
  42. AppleSingle/AppleDouble Formats for Foreign Files Developer's Note. Дата обращения: 23 октября 2007. Архивировано из оригинала 17 июля 2011 года.
  43. 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.»
  44. ZigBee Cluster Library Specification. (Section 2.5.2.21 UTCTime)
  45. NASA JPL [@NASAJPL] (4 мая 2021). The Force is strong with this little one (Твит) — Твиттер.
  46. Yet Another Gamecube Documentation. www.gc-forever.com. Дата обращения: 30 июня 2025.
  47. NeoGPS/src/NeoTime.cpp at master · SlashDevin/NeoGPS (англ.). GitHub. Дата обращения: 5 ноября 2023.

Литература

Ссылки