дата - годы до 1901 года считаются недействительными

11

У меня дата (GNU coreutils) 7.1 установлена ​​в моей системе.

Если я пытаюсь проверить даты до 14 декабря 1901 года, я получаю ошибку «неверная дата». Например,

  $ date -d 1901-12-13
  date: invalid date `1901-12-13'

  $ date -d 1901-12-14
  Sat Dec 14 00:00:00 EST 1901

Что я должен сделать, чтобы dateутилита считала действительными годы до 1901 года?

Я получаю похожие ошибки на даты после 19 января 2038 года

Джасдип Сингх
источник
Я не получаю ошибки. Я использую Coreutils 8.10, может быть, старая ошибка?
ксенотеррацид
@xenoterracide - вы 64-битная система?
Микель
@Mikel да, я
ксенотеррацид

Ответы:

15

Хороший вопрос.

Документация говорит , что это должно быть разрешено.

 info date 'Date input formats' 'Calendar date items'

Для числовых месяцев разрешен формат ISO 8601 `YEAR-MONTH-DAY ', где YEAR - любое положительное число, ...

Должен присутствовать начальный ноль, если число меньше десяти.

Если ГОД 68 или меньше, то 2000 добавляется к нему; в противном случае, если ГОД меньше 100, то к нему добавляется 1900.

Вы в 32-битной системе?

Вы получаете ошибку с датами после 2038-01-20, например,

date -d '2038-01-20'

Если это так, то звучит так, будто в GNU date используется 32-битное значение времени.

Я не уверен, как вы можете это исправить, кроме использования 64-битной системы или использования другого инструмента, например DateTime в Perl или datetime в Python.

Немного предыстории:

Unix times подсчитывает количество секунд с 1 января 1970 года, используя целочисленное значение. Если система использует 32-разрядные целые числа, она может считать только 2,1 миллиарда секунд вперед (до 2038-01-19 03:14:02 UTC) и 2,1 миллиарда секунд назад (обратно к 1901-12-13 20:45:52 УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ).

Больше информации на:

Mikel
источник
Спасибо, Микель, я верю, что я на 32-битной машине. На самом деле, я работаю на удаленном сервере, и сервер не будет раскрывать много информации даже с помощью unameкоманды, за исключением того факта, что он говорит о машине i686, которая, как я предполагаю, является 32-битной. Что касается проблемы 2038 года, то да, эта проблема существует на удаленном сервере. Еще раз спасибо за ваш вклад! Очень признателен!!
Джасдип Сингх
Да, i686 является 32-битным. Рад помочь. Если вам нужна помощь в работе с датами старше этого, попробуйте предложенные мной модули Python и Perl и задайте еще один вопрос, если вы не можете заставить его работать.
Микель
7

Ваша система (или, по крайней мере, эта версия даты ), вероятно, использует 32-битное значение внутреннего времени.

Эпоха Unix (нулевое значение времени) - 1970-01-01 00:00:00 UTC. Эта отправная точка помещает 1901-12-13 00:00 EST вне диапазона 32-разрядного значения времени со знаком.

1901-12-14 00:00:00 EST -2147454000
1901-12-13 15:45:52 EST -2147483648 (он же INT_MINв C, минимальное 32-разрядное целое число со
знаком ) 1901-12-13 00:00: 00 EST -2147540400

Вы можете попробовать использовать 1901-12-13 15:45:52 EST. Это должно работать, но одна секунда раньше, вероятно, потерпит неудачу так же, как 1901-12-13 00:00.

Крис Джонсен
источник