Почему даты отсчитываются с 1 января 1970 года?

99

Есть ли причина использовать дату (1 января 1970 г.) в качестве стандарта по умолчанию для управления временем? Я видел этот стандарт как в Java, так и в Python. Эти два языка мне известны. Существуют ли другие популярные языки, соответствующие тому же стандарту?

Пожалуйста, опишите.

Виджей Шанкер Дубей
источник
1
Другой популярный язык, соответствующий тому же стандарту, - PHP, это довольно распространенная точка отсчета времени.
Greg K

Ответы:

67

Это стандарт времени Unix.

Время Unix, или время POSIX, - это система для описания моментов времени, определяемых как количество секунд, прошедших с полуночи пролептического всемирного координированного времени (UTC) 1 января 1970 года, не считая дополнительных секунд.

солдат. моль
источник
5
Знаете ли вы, каждый ли Керниган и Томпсон излагали причину, по которой выбрали именно этот момент, помимо «Это круглое число, незадолго до того, как мы начали строить вещь»?
dmckee --- котенок экс-модератора
Это начало года, это в нулевом часовом поясе (зулусский). Оба они упрощают код форматирования даты.
Donal Fellows,
28
Не считает дополнительные секунды? Я не знал этой детали. Подумав об этом несколько мгновений, я понимаю, почему ты так поступил, но чувак. мой мир разрушен. на 24 секунды.
keturn
70

использование даты (1 января 1970 г.) в качестве стандарта по умолчанию

Вопрос делает два ложных предположения:

  • Учет времени в вычислениях ведется с 1970 года.
  • Такое отслеживание является стандартным.

Две дюжины эпох

Время в вычислениях не всегда отслеживается с начала 1970 UTC . Хотя ссылка на эту эпоху популярна, различные вычислительные среды на протяжении десятилетий использовали по крайней мере почти два десятка эпох . Некоторые из других веков. Они варьируются от 0 (нулевого) года до 2001 года.

Вот несколько.

0 января 1 г. до н. Э.

1 января, 1 год нашей эры

15 октября 1582 г.

1 января 1601 г.

31 декабря 1840 г.

17 ноября 1858 г.

30 декабря 1899 г.

31 декабря 1899 г.

1 января 1900 г.

1 января 1904 г.

31 декабря 1967 г.

1 января 1980 г.

6 января 1980 г.

1 января 2000 г.

1 января 2001 г.

Эпоха Unix Обычная, но не доминирующая

Начало 1970-х годов популярно, вероятно, из-за его использования в Unix. Но это ни в коем случае не доминирует. Например:

  • Бесчисленные миллионы (миллиарды?) Документов Microsoft Excel и Lotus 1-2-3 используют January 0, 1900(31 декабря 1899 г.).
  • Мир в настоящее время имеет более миллиарда IOS / устройств OS X с использованием Cocoa (NSDate) эпоха в 1 January 2001, GMT.
  • В GPS навигационной системы спутникового использование в January 6, 1980то время как европейские альтернативных Galileo использования 22 August 1999.

ISO 8601

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

Я настоятельно рекомендую вместо этого сериализовать значения даты и времени как недвусмысленные строки ISO 8601 для обмена данными, а не целочисленное значение count-Since-epoch: YYYY-MM-DDTHH:MM:SS.SSSZнапример 2014-10-14T16:32:41.018Z.

Подсчет того, что с эпохи

Еще одна проблема с отслеживанием времени «отсчет с эпохи» - это единица времени с обычно используемыми как минимум четырьмя уровнями разрешения.

  • Секунды
    Первоначальные средства Unix использовали целые секунды, что привело к проблеме 2038 года, когда мы достигли предела секунд с 1970 года, если они сохранены как 32-битное целое число.
  • Миллисекунды
    Используется более старыми библиотеками Java, включая связанный класс java.util.Date и библиотеку Joda-Time .
  • Микросекунды,
    используемые базами данных, такими как Postgres .
  • Наносекунды
    Используется новым пакетом java.time в Java 8.

Диаграмма, показывающая различное программное обеспечение, отсчитывающее от эпохи по секундам, миллисекундам, микросекундам или наносекундам.

Василий Бурк
источник
1
Интересно, какая в настоящий момент доминирующая эпоха ... вы основывали это на данных?
PascalVKooten 02
1
@PascalVKooten Многие разные эпохи используются во многих различных средах и программных системах. Итак, нет одной доминирующей эпохи. Я хочу сказать, что никогда не предполагайте эпоху. Знайте свой источник данных. Лучший подход - для источника данных полностью избежать проблемы эпохи и просто использовать строки ISO 8601, IMHO.
Basil Bourque
1
Спасибо за ваш ответ. Я понимаю, что их много, но мне любопытно узнать, стал ли, например, POSIX со временем более популярным.
PascalVKooten 03
Это интересно и почти не отвечает на вопрос, почему 1970 год был выбран в качестве эпохи Unix.
Unknow0059
7

почему это всегда 1 января 1970 года, потому что - «1 января 1970 года», обычно называемое «датой эпохи», является датой начала времени для компьютеров Unix, и эта отметка времени помечена как «0». Любое время с этой даты рассчитывается на основе количества прошедших секунд. Проще говоря ... метка времени любой даты будет разницей в секундах между этой датой и «1 января 1970 года». Метка времени - это просто целое число, которое начинается с числа «0» в «полночь 1 января 1970 года» и продолжает увеличиваться. на «1» при каждом втором проходе. Для преобразования временных меток UNIX в удобочитаемые даты PHP и другие языки с открытым исходным кодом предоставляют встроенные функции.

Фриянк
источник
Почему даты отсчитываются с 1 января 1970 года? Потому что даты отсчитываются с 1 января 1970 года. Это круговая логика, которая ни на что не отвечает.
Unknow0059
5

Есть ли причина использовать дату (1 января 1970 г.) в качестве стандарта для манипуляции временем?

Нет причины, которая имеет значение.

timeМодуль Python - это библиотека C. Спросите Кена Томпсона, почему он выбрал эту дату для эпохальной даты. Может это был чей-то день рождения.

В Excel используются две разные эпохи. Есть ли причина, по которой разные версии Excel используют разные даты?

За исключением настоящего программиста, никто никогда не узнает, почему были приняты такие решения.

А также...

Неважно, почему была выбрана дата. Просто было.

Астрономы используют свою эпохальную дату: http://en.wikipedia.org/wiki/Epoch_(astronomy)

Зачем? Чтобы математика работала, нужно выбрать дату. Подойдет любая случайная дата.

Дата в далеком прошлом избегает отрицательных чисел в общем случае.

Некоторые из более умных пакетов используют пролептический григорианский год 1. Какая причина почему год 1?
В таких книгах, как «Календарные вычисления», приводится причина: это немного проще математически.

Но если задуматься, разница между 1/1/1 и 01.01.1970 составляет всего 1969 год, тривиальное математическое смещение.

С.Лотт
источник
1
Если бы был выбран 1/1/1, у нас бы уже закончились секунды (2 ^ 31). В нынешнем виде в 2038 году мы столкнемся с проблемой 2000 года для 32-разрядных операционных систем. en.wikipedia.org/wiki/Year_2038_problem
Крис Нава,
1
@Chris Nava: Люди, которые используют 1/1/1, считают дни, а не секунды. 2 миллиарда дней - это около 5 миллионов лет. Часто они сохраняют пару (день, время) для максимального разрешения по времени; в большинстве дней всего 86400 секунд.
S.Lott
@ С.Лотт: Да. Я просто указывал, что, поскольку большинство программ считает секунды (а не минуты) с эпохи, 1/1/1 было слишком далеко в прошлом, чтобы быть разумной датой начала. Поэтому в качестве компьютерной эпохи (и, соответственно, начала ИТ-революции) была выбрана более поздняя дата. ;-)
Крис Нава
@Chris Nava: "большинство"? Я предполагаю, что под «большинством» вы имеете в виду «Linux». Другие ОС работают не так, как Linux. Вопрос в том, что «разумно» и «почему 01.01.1970?» на непростые вопросы; самое главное, ответ не имеет значения. «разумный», правда, но это не причина , почему . Причина , почему что - то только Кен Томпсон может ответить.
S.Lott
3

В) «Почему даты отсчитываются с 1 января 1970 года?»

A) Он должен был быть как можно более свежим, но при этом включать некоторое прошлое. Скорее всего, не было никакой другой существенной причины, поскольку многие люди думают так же.

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

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

Отметка времени не была предназначена для календаря, это эпоха. И я считаю, что майя создали свой долгосрочный календарь, используя ту же точку зрения. (это означает, что они чертовски хорошо знали, что у них нет никаких отношений с прошлым, им просто нужно было увидеть его в большем масштабе)

Йезпахр
источник
1

Да, клиент (и его семья). Именно здесь Java приняла это.

Петер Торок
источник