ngày - năm trước năm 1901 được coi là không hợp lệ


11

Tôi đã cài đặt ngày (GNU coreutils) 7.1 trên hệ thống của mình.

Nếu tôi cố kiểm tra ngày trước ngày 14 tháng 12 năm 1901, tôi sẽ gặp lỗi "ngày không hợp lệ". Ví dụ,

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

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

Tôi nên làm gì để làm cho datetiện ích coi các năm trước năm 1901 là hợp lệ?

Tôi nhận được lỗi tương tự cho các ngày sau ngày 19 tháng 1 năm 2038


Tôi không nhận được lỗi. Tôi đang sử dụng coreutils 8.10, có thể là một lỗi cũ?
xenoterracide

@xenoterracide bạn có phải là hệ thống 64 bit không?
Mikel

@Mikel vâng, tôi là
xenoterracide

Câu trả lời:


15

Câu hỏi hay.

Các tài liệu nói rằng nó nên được cho phép.

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

Đối với các tháng số, định dạng ISO 8601 `NĂM-THÁNG-NGÀY 'được cho phép, trong đó NĂM là bất kỳ số dương nào, ...

Số 0 đứng đầu phải có mặt nếu một số nhỏ hơn mười.

Nếu NĂM là 68 hoặc nhỏ hơn, thì 2000 được thêm vào nó; mặt khác, nếu NĂM nhỏ hơn 100, thì 1900 được thêm vào nó.

Bạn có đang sử dụng hệ thống 32 bit không?

Bạn có gặp lỗi với ngày sau 2038-01-20 không, vd

date -d '2038-01-20'

Nếu vậy, có vẻ như ngày GNU đang sử dụng giá trị thời gian 32 bit.

Tôi không chắc chắn làm thế nào bạn có thể sửa lỗi này ngoài việc sử dụng hệ thống 64 bit hoặc sử dụng một công cụ khác, ví dụ DateTime trong Perl hoặc datetime trong Python.

Một số nền tảng:

Thời gian Unix đếm số giây từ ngày 1 tháng 1 năm 1970 bằng cách sử dụng một giá trị số nguyên. Nếu hệ thống sử dụng số nguyên 32 bit, nó chỉ có thể đếm được 2,1 tỷ giây chuyển tiếp (tối đa 2038-01-19 03:14:02 UTC) và 2,1 tỷ giây ngược (trở lại 1901-12-13 20:45:51 UTC).

Biết thêm thông tin tại:


Cảm ơn Mikel, tôi tin rằng tôi đang ở trên máy 32 bit. Trên thực tế, tôi đang làm việc với một máy chủ từ xa và máy chủ sẽ không tiết lộ nhiều thông tin ngay cả với unamelệnh ngoại trừ thực tế là nó nói là máy i686, mà tôi giả sử là máy 32 bit. Đối với vấn đề năm 2038, vâng, vấn đề đó vẫn còn nguyên vẹn trong máy chủ từ xa. Cảm ơn một lần nữa cho đầu vào của bạn! Nhiều đánh giá cao!!
Jasdeep Singh

Có, i686 là 32 bit. Vui mừng được giúp đỡ. Nếu bạn cần trợ giúp xử lý các ngày cũ hơn thế, hãy thử các mô-đun Python và Perl mà tôi đề xuất và đăng một câu hỏi khác nếu bạn không thể làm cho nó hoạt động.
Mikel

7

Hệ thống của bạn (hoặc ít nhất là phiên bản ngày đó ) có thể đang sử dụng giá trị thời gian nội bộ 32 bit.

Kỷ nguyên Unix (giá trị thời gian bằng không) là 1970-01-01 00:00:00 UTC. Điểm bắt đầu này đặt 1901-12-13 00:00 EST ngay bên ngoài phạm vi giá trị thời gian 32 bit đã ký.

1901-12-14 00:00:00 EST là -2147454000
1901-12-13 15:45:52 EST là -2147483648 (còn gọi là INT_MINC, số nguyên có chữ ký tối thiểu 32 bit)
1901-12-13 00:00: 00 EST là -2148540400

Bạn có thể thử sử dụng 1901-12-13 15:45:52 EST. Nó sẽ hoạt động, nhưng một giây trước đó có thể sẽ thất bại theo cách tương tự như 1901-12-13 00:00.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.