дата - роки до 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 так, я
xenoterracide

Відповіді:


15

Хороше питання.

У документації зазначено, що це слід дозволити.

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

Протягом числових місяців допускається формат ISO 8601 "РІК-МЕСЯЧ-ДЕНЬ", де РІК - будь-яке додатне число, ...

Початковий нуль повинен бути присутнім, якщо число менше десяти.

Якщо РІК становить 68 або менше, то до нього додається 2000; в іншому випадку, якщо РІК менше 100, то до нього додається 1900 рік.

Ви перебуваєте в 32-бітній системі?

Чи отримуєте ви помилку з датами також після 2038-01-20, наприклад, наприклад

date -d '2038-01-20'

Якщо це так, це здається, що дата GNU використовує 32-бітове значення часу.

Я не впевнений, як ви можете виправити це, крім використання 64-бітної системи або використання іншого інструменту, наприклад DateTime в Perl або datetime в Python.

Деякі відомості:

Часи Unix рахують кількість секунд з 1 січня 1970 року, використовуючи ціле значення. Якщо система використовує 32-бітні цілі числа, вона може рахувати лише 2,1 мільярда секунд вперед (до 2038-01-19 03:14:02 UTC) і 2,1 мільярда секунд назад (назад до 1901-12-13 20:45:52 UTC).

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


Дякую Мікель, я вважаю, що я на 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.