2012-01-20 15 views
15

Như tất cả các lập trình viên Perl (hy vọng) biết, giá trị năm từ một cuộc gọi đến localtime chức năng Perl là tương đối so với 1900. Tự hỏi tại sao điều này là, tôi đã xem xét các perldoc for localtime, và thấy nugget thú vị này:Tại sao giá trị năm trong hàm địa phương của Perl (và cấu trúc tm của C) liên quan đến 1900?

Tất cả các phần tử danh sách đều là số và đi thẳng ra khỏi C `struct tm '.

Nhìn vào số C++ reference for the tm struct, tôi thấy rằng biến thành viên tm_year được khai báo là int.

Câu hỏi: Tại sao, sau đó, là giá trị năm có liên quan đến năm 1900 và không chỉ đơn giản là năm đầy đủ, bốn chữ số? Có lý do lịch sử nào không? Dường như với tôi rằng, ngay cả với những giới hạn bộ nhớ sớm trong máy tính, một số nguyên (rõ ràng) là quá đủ để lưu trữ cả năm. Phải có lý do chính đáng; Tôi tò mò về những gì có thể.

+7

Lịch sử. Lỗi Y2K không phải là hiển nhiên trong đầu những năm 70 khi tiêu chuẩn thực tế đã được sửa. Sau đó, đã quá muộn để thay đổi nó mà không phá vỡ một lượng lớn mã. –

Trả lời

14

Tôi đã lập trình vào đầu những năm 1970, trước khi C và Unix được phát minh. Hai năm chữ số đã được sử dụng để tiết kiệm không gian đĩa rất chặt chẽ, chúng tôi luôn cố gắng tìm ra các thủ thuật như thế để cứu nó. Chiếc máy đầu tiên tôi làm việc có hai ổ đĩa 20 megabyte, mỗi chiếc có kích thước bằng một chiếc máy giặt.

Tôi làm việc tại một bệnh viện có vấn đề Y2K năm 1975. Tuổi của bệnh nhân là điều quan trọng cần biết và ngày sinh chỉ có hai năm. Là một bệnh viện, chúng tôi rõ ràng đã có một số bệnh nhân rất cũ, sinh ra trong những năm 1800. Hệ thống giả định rằng bất cứ ai có năm sinh 75 tuổi trở lên được sinh ra vào những năm 1800. Điều này làm việc tốt cho những người sinh năm 1890, nhưng một lần vào ngày 1 tháng 1 năm 1975, tất cả mọi người đều đã tan vỡ khi những đứa trẻ sơ sinh được coi là 100 tuổi. (Nó cũng là một bệnh viện sản phụ chính.) Chúng tôi chạy xung quanh sửa chữa vấn đề đó bằng cách di chuyển ngưỡng 75-80. Đó cũng là sự hiểu biết đầu tiên của tôi về vấn đề Y2K sẽ xảy ra, và tôi nhận ra mình sẽ làm tốt hơn một cái gì đó khác vào năm 2000. Tôi đã thất bại.

Những người nghĩ rằng Y2K không phải là một vấn đề thực sự bởi vì không có gì xảy ra không hiểu số lượng công việc đã đi vào sửa chữa công cụ trong vài năm trước.

+0

Như một câu hỏi tiếp theo, bất kỳ ý tưởng nào tại sao giá trị 'tm_month' là 0-tương đối và không phải 1-tương đối? Cũng giống như giá trị năm, có một chút phiền toái khi phải nhớ thêm 1 khi tạo ngày ... –

+5

RE: 'tm_month', tôi luôn nghe thấy sự bùng nổ rằng' tm_month' được dự định sẽ được sử dụng như một chỉ số, như sau: '@months = qw (Jan Feb Mar ... Dec); in $ tháng [$ tm_month]; ' –

5

Khi máy tính bắt đầu theo dõi thời gian, năm chỉ được tham chiếu với 2 chữ số. Đối với phần "tại sao", tôi đã không nghe thấy bất kỳ lý do xác định nào, ngoài "Họ sẽ không phải lo lắng về điều đó trong 30 năm nữa". Khi đồng hồ gặp nguy hiểm gần năm 2000 và mọi người nhận ra rằng mã của họ cần theo dõi thời gian sau năm 1999, phần lớn phần mềm vẫn sử dụng 2 chữ số (sau đó, mọi người trao đổi thành 4 chữ số sẽ phá vỡ nhiều mã trừ khi 100% đổi chỗ). Cách giải quyết để né tránh lỗi Y2K là làm cho năm tham chiếu đến năm 1900.

Đây là một trong những trường hợp mà nó có thể được thực hiện ngay từ đầu. (Bố trí bàn phím QWERTY ban đầu được thiết kế là không hiệu quả. Ngoài ra, dòng điện trong mạch điện tử được đọc là đi từ + đến -, trong khi trên thực tế, các electron thực sự di chuyển theo hướng ngược lại).

+2

Tất cả chúng ta có thể đồng ý với một danh sách việc cần làm trong trường hợp ai đó ở đây phát minh ra một timemachine không? Tôi cho một người luôn luôn muốn cảnh báo Benjamin Franklin về việc đi đúng hướng nhưng ý tưởng của anh ta là sai đường. – Jarmund

+0

Và tất nhiên nó không phải là các electron di chuyển từ + đến -, đó là tiềm năng di chuyển từ + đến -. :-) –

+0

@R Bạn đã đúng một phần. QWERTY được thiết kế không hiệu quả. Đối với phần truyền thuyết đô thị, một số nguồn cho rằng dvorak không nhanh hơn qwerty. Những nguồn này chủ yếu dựa trên một nghiên cứu (bởi Hải quân Hoa Kỳ, iirc) so sánh các kiểu chữ của cả qwerty lẫn dvorak, nhưng nghiên cứu này ít được ghi nhận nên không biết kiểu chữ được sử dụng hàng ngày như thế nào . Tuy nhiên, QWERTY cho thấy điểm yếu của nó theo thời gian, nhưng điều này chủ yếu là để gõ một tay, và bất kỳ ràng buộc nào khác không đủ lớn để tôi lo lắng học cách gõ lại toàn bộ với bố cục mới. – Jarmund

4

Đây là suy đoán.

Quay lại khi Unix được phát minh có máy đang được sử dụng có các từ 36 bit và một cách giải nén phổ biến các từ đó là 4 ký tự 9 bit. Nếu tm_year được đặt thành năm - 1900 thì tất cả các trường cấu trúc tm riêng lẻ sẽ phù hợp với ký tự không được ký 9 bit. Bộ nhớ rất chặt chẽ trên những cỗ máy cũ, vì vậy việc đóng gói dữ liệu chặt chẽ vào các cấu trúc là mối quan tâm lớn hơn so với ngày hôm nay.

Các vấn đề liên quan