Серийный номер даты, начиная с «1 января, 0000»: это -1 B C или +1 CE? - PullRequest
3 голосов
/ 08 января 2020

Я работал над датами в Matlab и Octave, и формат "серийного номера даты" задокументирован как

Одно число, равное количеству дней с января 0, 0000 в календаре prolepti c ISO (с указанием использования григорианского календаря).

В Октаве они документируют

Возврат дата / время вводятся как порядковый номер дня, причем 1 января 0000 определяется как день 1.

В григорианском каландре не используется ноль года . Но Matlab и Octave относятся к нулевому году. Означает ли это, что они относятся к году -1 B C, как в астрономическом году, нумерация которого ?

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

1 Ответ

3 голосов
/ 08 января 2020

Во-первых, обратите внимание, что определения MATLAB и Octave эквивалентны

[MATLAB] N = "number of days since Jan 0, 0000"[OCTAVE] "Jan 1, 0000 is day 1"

С N = 1 в день 1.


Страница Википедии «Нулевой год» (на которую вы ссылаетесь) предлагает следующее:

[...] год 1 B C сопровождается нашей эры 1. Однако в нумерации астрономических годов существует нулевой год (где он совпадает с юлианским годом 1 B C) и в ISO 8601: 2004 (где он совпадает с григорианским годом 1 B C) , а также во всех буддийских и индуистских календарях.

Похоже, что MATLAB и Octave следовали стандарту ISO, как указано в datetime документах :

Массивы даты и времени представляют моменты времени используя prolepti c календарь ISO

Таким образом, нулевой год и, следовательно, значение datenum, равное 1 дням, совпадает с первым днем ​​1B C. В соответствии с определениями в верхней части этого ответа

"day 1"
= 1/Jan/0000
= datenum(1)
= datetime( 1, 'ConvertFrom', 'datenum' )
= datetime( 0, 0, 1 )

Мы можем протестировать, используя datenum (количество дней) и datetime (объект типа datetime)

datenum( 0, 0, 1 ) % = 1, as defined by the docs

datetime( 1, 'ConvertFrom', 'datenum' )     
% = 1/Jan/0000 00:00:00

datetime( 1 + 366, 'ConvertFrom', 'datenum' )
% = 1/Jan/0001 00:00:00
% First day of year 1 after 366 days (leap year 0000 + 1 for Jan 1 )
...