Vấn đề năm 2038 [đã đóng]


Câu trả lời:


17

Tôi đã gặp phải vấn đề này trong một hệ thống Linux nhúng cần xử lý ngày 2038 trong một số chứng chỉ mật mã dài hạn, vì vậy tôi muốn nói rằng sự giống nhau của điều này phụ thuộc vào miền ứng dụng của bạn.

Mặc dù hầu hết các hệ thống nên sẵn sàng trước năm 2038, nhưng nếu bạn thấy mình tính toán ngày hôm nay trong tương lai, bạn có thể gặp vấn đề.


Tốt một! Tôi đã không nghĩ về ví dụ đó! Tiêu chuẩn PKI sử dụng như một cú pháp thời gian trong chứng chỉ là gì? Tôi chưa bao giờ nhìn!
geoffc

@geoffc, Trên thực tế, đây là định dạng độc quyền và có cấu trúc ngày / giờ bên trong, bản thân nó đủ lớn để phù hợp với ngày qua năm 2038, nhưng nó đã sử dụng các chức năng GLIBC để chuyển đổi ngày / giờ. Nếu tôi nhớ lại một cách chính xác, mktimecuộc gọi đã âm thầm thất bại.
Alex B

13

Tôi nghĩ rằng đây sẽ là một vấn đề quan trọng, nguy hiểm hơn nhiều so với các vấn đề Y2K năm 1999/2000 bởi vì mã bị ảnh hưởng thường ở cấp độ thấp hơn (đó là CTIME) và do đó khó phát hiện ra những nơi lưu trữ thời gian theo cách đó.

Để làm phức tạp vấn đề hơn nữa, việc Y2K bị coi là một đội hình ẩm ướt sẽ khiến việc thu hút sự chú ý đến vấn đề trong sự kiện diễn ra sự kiện trở nên khó khăn hơn.

Tài liệu tham khảo văn hóa:

Cory Doctorow đang thử một mô hình mới để bắt đầu / xuất bản truyện ngắn theo giấy phép mở và tôi đã đề xuất một chủ đề năm 2038, một trong số đó, anh ấy đã làm rất xuất sắc trong Epoch: http://craphound.com/?p=2337


Nói như một người đang giải quyết vấn đề vào thời điểm đó, Y2K đã xì hơi vì rất nhiều công việc và kế hoạch trước đó. Nhận thức squib ẩm ướt được củng cố bởi tất cả các ngày tận thế cường điệu trong các phương tiện truyền thông. Tôi hy vọng sẽ có rất nhiều kế hoạch và công việc được thực hiện bắt đầu từ năm 2035 hoặc lâu hơn, nhưng nếu chúng ta may mắn, chúng ta sẽ bỏ lỡ các phương tiện truyền thông.
David Thornley

Chúc mừng cho các liên kết Mark.
boehj

9

Vài năm trước, đã có báo cáo về các vấn đề đã xảy ra, trong các lĩnh vực như các chương trình thế chấp thực hiện tính toán cho các khoản vay 30 năm: 2008 + 30 = 2038.


8

Một hệ điều hành 64 bit cuối cùng không liên quan đến vấn đề 2037. (CTIME hết gần năm 2037 so với năm 2038).

Câu hỏi không phải là độ sâu bit của HĐH, mà là hệ điều hành lưu trữ thời gian như thế nào. Hoặc làm thế nào để cột cơ sở dữ liệu chọn để lưu trữ thời gian. Hoặc làm thế nào để thư mục này dịch vụ thời gian thuộc tính cú pháp lưu trữ thời gian ở phía sau.

Đây là một vấn đề lớn hơn nhiều so với mọi người nghĩ, vì nó rất đặc hữu và phổ biến khi sử dụng bộ đếm thời gian 32 bit.

Mỗi trường hợp lưu trữ thời gian cần phải được xem lại và tất cả các API được cập nhật và tất cả các công cụ sử dụng nó cũng được cập nhật.

Các lớp trừu tượng cho phép bạn đặt thời gian thông qua định dạng thời gian có thể đọc được của con người, thay vì dữ liệu thô được viết ra giúp dễ dàng hơn, nhưng đó chỉ là một trường hợp.

Tôi nghi ngờ đây sẽ là một thỏa thuận lớn hơn nhiều so với hầu hết mọi người nghĩ.


1
Vấn đề lớn nhất tôi thấy là định dạng tệp và tệp tin, tuy nhiên phạm vi ngày cho ext4 là 2514, vfat là 2107. Vấn đề là với reiserfs (2038).
Maciej Piechotka

ReiserFS có các vấn đề khác vẫn còn. Tôi vẫn nghĩ rằng có nhiều nơi ẩn giấu hơn mọi người nghĩ về thời gian lưu trữ trong CTIME. Nó là một định dạng thời gian dễ dàng và hữu ích. Tất nhiên, CTIME không dấu không có vấn đề 2037. Tôi nghĩ đó là trường hợp dấu thời gian 2107.
geoffc

1
Bạn đang nghĩ về Apple HFS. FAT hoàn toàn không sử dụng time_t. Nó lưu trữ năm, tháng và ngày dưới dạng các trường trong một giá trị 16 bit: 5 bit cho ngày, 4 cho tháng, để lại 7 cho năm. 2107 là 1980 (năm số 0 ở vùng đất FAT) + 2 ^ 7-1. Để vui hơn, FAT lưu trữ thời gian trong ngày theo cùng một cách trong một giá trị 16 bit khác, nhưng nếu bạn làm toán, bạn thấy rằng bạn cần 17 bit để lưu trữ thời gian trong ngày theo cách này. FAT khắc phục điều này bằng cách giảm một chút độ phân giải trong vài giây; FAT không thể phân biệt các thay đổi cách nhau dưới 2 giây. Ah, Microsoft, thật là một thế giới nhàm chán nếu không có sự không tương thích không cần thiết của bạn!
Warren Young

8

Đây là ý kiến ​​của tôi, nhưng vấn đề này là do sự cố bộ đếm 32 bit, ngày nay hầu hết các hệ điều hành được cập nhật để xử lý thời gian trên 64 bit (ít nhất là trên máy tính 64 bit), vì vậy tôi đoán rằng tất cả hệ điều hành và phần mềm sẽ sẵn sàng lâu thời gian trước năm 2038, giả sử năm 2020. Vì vậy, bạn chỉ có thể gặp sự cố nếu vào năm 2038, bạn vẫn sẽ chạy phần mềm từ năm 2020.
Nó có thể không phải là vấn đề trong hầu hết mọi trường hợp. Tôi hi vọng.


Tôi đã thử phiên bản Ubuntu 32 bit và nó cho thấy 2038 vấn đề nhưng chạy phiên bản Ubuntu 64 bit không có dấu hiệu của sự cố 2038. Tôi chưa thử bất kỳ Unix nào khác.
Jimmy Hedman

Có trên hầu hết phiên bản 32 bit, bạn sẽ thấy vấn đề nhưng không phải trên phiên bản 64 bit. Bạn có thể mong đợi không còn hệ điều hành 32 bit nào vào năm 2038.
bán kính

2
Đây là một giả định vô lý. Chúng ta vẫn sử dụng bộ vi xử lý 16 (và thậm chí 8 bit) trong thế giới ngày nay, điều gì để nói bộ vi xử lý 32 bit sẽ biến mất một cách kỳ diệu trong tương lai? Công bằng mà nói điều này sẽ không ảnh hưởng đến người dùng trung bình, nhưng trong các trường hợp cạnh có thể tiếp tục là một vấn đề.
Eli Frey

Chà - máy tính 16 bit và 8 bit có thể 1. chuyển ngày 0 (từ 1970-01-01 sang ví dụ 2010-01-01) - tuy nhiên, nó sẽ phá vỡ một số quy ước API / ABI nhất định 2. mở rộng trường hẹn giờ ( trong một số trường hợp có thể phá vỡ 'chỉ' ABI).
Maciej Piechotka

1

Không phải là một vấn đề lớn.

Trong phiên bản Y2K đầu tiên, trong đó các nhà cung cấp phần mềm và phần cứng được yêu cầu chứng nhận sản phẩm của họ là "tuân thủ Y2K" để bán (Tôi nhớ rằng cáp mạng trên PC Connection được chứng nhận Y2K tuân thủ) rất nhiều công ty đã kiểm tra chi tiết mọi thứ , bằng cách đặt đồng hồ trong tương lai và thử nghiệm.

Vào thời điểm đó, vì chi phí thử nghiệm rất cao, nên hầu như họ luôn thử nghiệm với một số ngày, chẳng hạn như 1/1/99 (một số nhà phát triển có thể đã sử dụng 99 như một tình cảm), 12/12/99, 1/1 / 00, bước nhảy vọt của năm 2000, 1/19/38 và nhiều thứ khác. Xem ở đây cho một danh sách tẻ nhạt.

Vì vậy, tôi tin rằng bất kỳ phần mềm quan trọng nào xuất hiện vào năm 1999 có thể sẽ không có 2038 lỗi, nhưng phần mềm mới được viết bởi những lập trình viên không biết gì có thể. Sau khi toàn bộ các lập trình viên của Y2K nói chung đã nhận thức rõ hơn về các vấn đề mã hóa ngày, do đó, nó không có khả năng gây ảnh hưởng lớn như Y2K (mà, bản thân nó, là một thứ gì đó của thuốc chống sốt rét).


Ngoại trừ vấn đề này là do loại time_t UNIX là 32 bit.
Yuhong Bảo

1

Hệ thống 32 bit vẫn chạy sau đó sẽ là một vấn đề.


2
Bạn có thể giải thích về điều đó, để làm cho nó rõ ràng hơn chính xác những gì trở thành vấn đề, và làm thế nào để phản ứng với điều đó?
Anthon

Vấn đề là với số nguyên 32 bit được sử dụng để tính thời gian. Thời gian được tính bằng số giây trôi qua kể từ ngày 1 tháng 1 năm 1970. Ví dụ: sau một ngày bộ đếm này sẽ ở mức 86400. Vì vậy, vào năm 2038, giá trị này sẽ tràn ra vì nó sẽ giữ một giá trị lớn hơn số có thể được giữ trong một số nguyên 32 bit không dấu. Một hệ thống 64 bit sử dụng 64 bit cho dấu thời gian sẽ không gặp phải vấn đề này vì nó sẽ có thể hoạt động đến 15:30:08 vào Chủ nhật, ngày 4 tháng 12, 292,277,026,596 (292 tỷ năm)
Rahul Kadukar

0
#include <time.h>
#include <stdio.h>

int main() {
  time_t t = (time_t)(1L << (sizeof(time_t)*8 - 9));
  printf("%d\n", sizeof(time_t));
}

nó phải là 1 thay vì 9 nhưng ctime không xử lý ngày lớn hơn:

8 - Sun Jun 13 07:26:08 1141709097

Thời gian hệ thống của tôi (64 bit) có thể chạy thêm 1 triệu năm nữa. Giải pháp là cập nhật hệ thống lên 64 bit.

Điều hấp dẫn là các chương trình có thể không xử lý nó. Đặc biệt là cũ, đúng cách và không được duy trì. Devs được sử dụng để theo dõi sự thật:

  • intCủa chúng là 32 bit (thực tế chúng được bảo toàn là 32 bit trên các hệ thống 64 bit trong số các bit khác vì nó được giả định là chúng luôn có 32 bit)
  • Hầu hết các loại (như time_t) có thể được đúc một cách an toànint

Trong phần mềm FLOSS phổ biến, cả hai điều có thể sẽ không thông qua đánh giá 'nhiều mắt'. Trên ít phổ biến và phù hợp, nó sẽ phụ thuộc rất nhiều vào tác giả.

Tôi đoán trên thế giới * nix miễn phí, năm 2038 sẽ nhận được 'không chú ý' trong khi tôi mong đợi các vấn đề trên nền tảng "đúng cách" (tức là những phần mềm có số lượng lớn phần mềm phù hợp) - đặc biệt là nếu một số phần quan trọng sẽ không được duy trì.


Nó không phải là 'hệ thống' hay 'Hệ điều hành'. Hầu hết mọi hệ điều hành 32 bit trước đây (thậm chí cả hệ điều hành 16 bit) đều có thể làm toán 64 bit. Độ sâu 64 bit ở cấp độ HĐH về cơ bản là tham chiếu đến mô hình bộ nhớ, không phải khả năng làm toán. Và thời gian là tất cả về toán học.
geoffc

Có và không. Đúng là HĐH 32 bit và 64 bit có thể thực hiện số học 64 bit (bạn có thể mô phỏng bất kỳ số học nào). Tuy nhiên time_t(hoặc tương đương) trên HĐH 32 bit xảy ra có 32 bit trong khi time_t(hoặc tương đương) trên HĐH 64 bit xảy ra có 64 bit. Tôi nghĩ rằng nó đã đủ rõ ràng ngay cả khi với sự đơn giản hóa nhất định.
Maciej Piechotka

0

Nếu đó là bất cứ thứ gì như Y2K, một số người đã bị ảnh hưởng và đang thay đổi phần mềm, nhưng hầu hết các nhà phát triển sẽ bỏ qua nó cho đến khoảng những năm 2030, có thể là 2035 hoặc lâu hơn, tại thời điểm đó sẽ có rất nhiều công việc được thực hiện và bất kỳ ai cũng đủ tuổi để biết K & R C và chưa quá già sẽ đột nhiên có thể ký hợp đồng với rất nhiều tiền. Việc chuyển đổi thực tế sẽ cho thấy rất nhiều điều chưa được thực hiện, có lẽ không có gì quan trọng cả.


-5

Vấn đề Y2K là hai biểu đồ đại diện cho năm thay vì bốn.

Nhiều hệ thống không có cách nào để phân biệt giữa năm 2000 và 1900 vì chúng chỉ lưu trữ '00'.

Hầu như tất cả các hệ thống hiện nay đều sử dụng 4 ký tự để lưu trữ trong năm hoặc chúng sử dụng một thư viện nào đó.

Vì vậy, hãy để tất cả lo lắng về năm 10000 (Y10K) thay vào đó. Ngoại trừ các nhà văn hệ điều hành và thư viện ...


Có lẽ bây giờ không có ai (thực tế là không có ai) đang lưu trữ ngày là định dạng như vậy (tức là DCD hoặc chuỗi). Thời gian thường được xử lý bởi các đối tượng hoặc số nguyên (vì vậy chỉ cần cập nhật mã hiển thị).
Maciej Piechotka

Vâng, quan điểm của tôi chính xác. Y2K thực sự giết chết ý tưởng biểu diễn ngày dưới dạng chuỗi có độ dài cố định.
Stephen Jazdzewski

@Stephen: Không phải trong thế giới COBOL, nhưng may mắn thay, có rất ít triển khai COBOL trên Unix / Linux.
David Thornley

@David: Phần lớn các chương trình COBOL là vấn đề của Y2K. Các hệ thống Linux / Unix, từ quan điểm người dùng, có bao giờ gặp sự cố Y2K không? Câu trả lời đơn giản cho câu hỏi ban đầu là không.
Stephen Jazdzewski

4
Người đăng không hỏi về vấn đề y2k; họ đang hỏi về vấn đề y2k38, một con thú hoàn toàn khác. Kiểm tra en.wikipedia.org/wiki/Y2K38 để biết mô tả.
Kevin M
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.