Как да представим датите преди епохата като времево клеймо на UNIX

Хрумна ми, че не знам за механизъм за съхраняване на дати преди 1970 януари. 1 като времеви отпечатъци на Unix. Тъй като тази дата е "епохата" на Unix, това не е голяма изненада.

Но - въпреки че не е проектирано за това - все пак искам да съхранявам дати от далечното минало в Unix формат.
Това ми трябва по причини.

Така че въпросът ми е: как би могло да се направи така, че unix-timestamps да съдържат "невалидни", но все още работещи дати? Ще свърши ли работа съхраняването на отрицателно количество секунди? Можем ли дори да съхраняваме отрицателни количества от секунди в unix-timestamp? Искам да кажа, не е ли неподписано?

Също така, ако съм прав, тогава бих могъл да съхранявам само дати до 1901. dec. 13 20:45:52 може ли това да бъде удължено по-назад в историята по някакъв начин?


person Wolfer    schedule 29.07.2015    source източник
comment
Unix time_t е подписано 32-битово int, така че може да се върне към 1901 г., както отбелязахте. Трябва да проверите вашата операционна система, много са разширили time_t до 64 бита, което ви дава няколкостотин милиарда години свобода на действие.   -  person Dan Lowe    schedule 29.07.2015


Отговори (1)


Unix Time е обикновено 32-битов брой цели секунди от първият момент от 1970 г. по UTC, като епоха е 1 January 1970 00:00:00 UTC. Това означава диапазон от около 136 години с около половината от двете страни на епохата. Отрицателните числа са по-ранни, нулата е епохата, а положителните са по-късни. За 32-битово цяло число със знак стойностите варират от 1901-12-13 до 2038-01-19 03:14:07 UTC.

Това не е написано на камък. Е, това е написано, но в куп различни камъни. По-старите казват 32-битови, по-новите 64-битови. Някои спецификации казват, че значението е дефинирано от изпълнението. Някои Unix системи използват unsigned int за разширяване само в бъдещето през епохата, но обичайната практика е число със знак. Някои използват float вместо цяло число. За подробности вижте статията в Уикипедия за Unix Time и този Въпрос.

Така че, по същество, вашият въпрос няма смисъл. Трябва да знаете контекста на вашия език за програмиране (стандартен C, друг C, Java и т.н.), среда (съвместим с POSIX), конкретна софтуерна библиотека, или хранилище на база данни, или приложение.

Избягвайте Count-From-Epoch

Добавете към тази липса на специфичност факта, че няколко дузини други епохи имат се използва от различни софтуерни системи, някои изключително популярни и често срещани. Примерите включват 1 януари 1601 г. за файлова система NTFS и COBOL, 1 януари 1980 г. за различни файлови системи FAT, 1 януари 2001 г. за Apple Cocoa и 0 януари 1900 г. за електронни таблици Excel & Lotus 1-2-3.

Допълнително добавете факта, че са използвани различни степени на преброяване. Освен цели секунди, някои системи използват милисекунди, микросекунди или наносекунди.

Препоръчвам да не проследявате дата-час като отброяване от епоха. Вместо това използвайте специфични типове данни, където са налични във вашия език за програмиране или база данни.

ISO 8601

Когато типовете данни не са налични или когато обменяте данни, следвайте стандарта ISO 8601, който дефинира разумно низови формати за различни видове стойности за дата-час.

  • Date
    • 2015-07-29
  • A date-time with an offset from UTC (Z is zero/Zulu for UTC) (note padding zero on offset)
    • 2015-07-29T14:59:08Z
    • 2001-02-13T12:34:56.123+05:30
  • Week (with or without day of week)
    • 2015-W31
    • 2015-W31-3
  • Ordinal date (day-of-year)
    • 2015-210
  • Interval
    • "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
  • Duration (format of PnYnMnDTnHnMnS)
    • P3Y6M4DT12H30M5S = "period of three years, six months, four days, twelve hours, thirty minutes, and five seconds"

Потърсете в StackOverflow.com много повече въпроси и отговори по тези теми.

person Basil Bourque    schedule 29.07.2015
comment
Страхотно, въпреки че се страхувах, че ще се стигне до implementation-defined. - person Wolfer; 30.07.2015
comment
localtime на Perl също се брои от 0 януари 1900 г., въпреки че това се споменава като масив от числа, а не секунди от епохата - person Electric Coffee; 20.08.2020