Глядя на голоса и отзывы, модуль DateTime, по-видимому, является авторитетным модулем для такого рода вещей. К сожалению, его документация $dt->epoch() поставляется с этими оговорками;
Since the epoch does not account for leap seconds, the epoch time for
1972-12-31T23:59:60 (UTC) is exactly the same as that for 1973-01-01T00:00:00.
This module uses Time::Local to calculate the epoch, which may or may not
handle epochs before 1904 or after 2038 (depending on the size of your system's
integers, and whether or not Perl was compiled with 64-bit int support).
Похоже, что это пределы, в которых вы собираетесь работать.
Сказав, что этот комментарий, вероятно, является разумным предупреждением для пользователей, которые
- используется машина с 32-битным Интсом; или
- имеют низкую толерантность к ошибке, даже для «старого» датирует
Первого это собирается быть проблемой, если у вас есть 32-битная машина.Диапазон (в годах) для подписанной 32-разрядной эпохи составляет около 2^31/(3600 * 24 * 365) или (только) 68 лет до 1970 года (предполагая эпоху unix). Тем не менее, для 64-битного набора это составляет 290 000 лет к 1970 году, и я думаю, что это будет нормально. :-)
Только вы можете сказать, будет ли вторая проблема проблемой. Присутствуют результаты обходного рассмотрения степени ошибки;
$ perl -MDateTime -E 'say DateTime->new(year => 0)->epoch/(365.25 * 24 * 3600)'
-1969.96030116359 # Year 0ad is 1969.96 years before 1970
$ perl -MDateTime -E 'say DateTime->new(year => -1000)->epoch/(365.25*24*3600)'
-2969.93839835729 # year 1000bc is 2969.94 years before 1970
$ perl -MDateTime -E 'say ((DateTime->new(year => -1000)->epoch - DateTime->new(year => 0)->epoch)/(365.25*24*3600))'
-999.978097193703 # 1,000bc has an error of 0.022 years
$ perl -MDateTime -E 'say 1000*365.25 + ((DateTime->new(year => -1000)->epoch - DateTime->new(year => 0)->epoch)/(24 * 3600))'
8 # ... or 8 days
$
Примечание: Я не знаю, сколько это «ошибка» связано с тем, как я экзаменационной это - год не 365,25 дней. Фактически, позвольте мне исправить это - я взял лучшее определение дней в году с here, и мы получаем;
$ perl -MDateTime -E 'say 1000*365.242189 + ((DateTime->new(year => -1000)->epoch - DateTime->new(year => 0)->epoch)/(24 * 3600))'
0.189000000013039
Таким образом, ошибка примерно 0,2 дней при работе с датами около 1000bc.
Короче говоря, если у вас 64-разрядная машина, вы должны быть в порядке.
Это не недостаток, это DWIM. – mob