Bash - date, hoạt động xung quanh lỗi 2038 trên hệ thống LINUX 32 bit


9

Tôi đã viết một kịch bản bash nhỏ khiến tôi vấp ngã trong "Lỗi năm 2038" . Tôi không biết về vấn đề này trước đây và tôi chỉ dám đăng kết --debugquả đầu ra mà tôi nhận được datekhi kịch bản của tôi cố gắng tính toán trong ngày kỳ diệu này (03:14:07 UTC ngày 19 tháng 1 năm 2038).

date -d "20380119"

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' = 2147468400 epoch-seconds
date: output timezone: +01:00 (set from system default)
date: final: 2147468400.000000000 (epoch-seconds)
date: final: (Y-M-D) 2038-01-18 23:00:00 (UTC0)
date: final: (Y-M-D) 2038-01-19 00:00:00 (output timezone TZ=+01:00)
Tue Jan 19 00:00:00 CET 2038

date -d "20380119 + 1 days"

date: parsed hybrid part: +1 day(s)
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00'
date: warning: when adding relative days, it is recommended to specify 12:00pm
date: error: adding relative date resulted in an invalid date: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: invalid date '20380119 + 1 days'

date -d "20380120" --debug

date: parsed number part: today/this/now
date: input timezone: +01:00 (set from system default)
date: warning: using midnight as starting time: 00:00:00
date: error: invalid date/time value:
date:     user provided time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date:        normalized time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00'
date: 
date:      possible reasons:
date:        numeric values overflow;
date:        missing timezone
date: invalid date '20380120'

Có cách nào để làm cho GNU datetính toán trong ngày này không?
(trên hệ thống LINUX 32 bit)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86

3
Một cách để khắc phục nó trong các hệ thống 32 bit là sử dụng HĐH * BSD.
Rui F Ribeiro


1
@Kusalananda xin lỗi vì không rõ ràng. Có, tôi đang hỏi về một cách cho GNU date. Tôi sẽ sửa câu hỏi của tôi ...
Nath

FWIW, OpenBSD đã sửa lỗi vào năm 2014 . Đó là một công việc rất nhiều, nhưng bằng cách nào đó họ đã quản lý để vá tất cả các bit có liên quan.
Satō Katsura

Câu trả lời:


14

Nếu bạn muốn gắn bó với GNU datetrên Linux 32 bit, không có cách nào dễ dàng để nó hoạt động với ngày sau năm 2038. Các nhà coreutilsbảo trì không coi đây là một coreutilslỗi , vì vậy đừng mong đợi một bản sửa lỗi ở đó - bản sửa lỗi sẽ có đến từ thư viện C và kernel. Nếu bạn muốn chơi xung quanh với công việc đang tiến hành, bạn sẽ cần:

và một lượng kha khá kỹ năng và sự kiên nhẫn.

Để biết thêm về cách 2038 đã được lên kế hoạch xử lý trong thế giới Linux 32 bit, hãy xem LWNbài viết của BoF 2038 tại DebConf 17 (với các bình luận tiếp theo ở đó và trên LWN ). Bài viết LWN tháng 1 năm 2019 này mô tả các thay đổi đang được thực hiện trong kernel.

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.