Tại sao ngày được tính từ ngày 1 tháng 1 năm 1970?


95

Có lý do gì đằng sau việc sử dụng ngày (ngày 1 tháng 1 năm 1970) làm tiêu chuẩn mặc định cho thao tác thời gian? Tôi đã thấy tiêu chuẩn này trong Java cũng như Python. Hai ngôn ngữ này tôi biết. Có những ngôn ngữ phổ biến nào khác tuân theo cùng một tiêu chuẩn không?

Làm ơn miêu tả.


1
Một ngôn ngữ phổ biến khác theo cùng một tiêu chuẩn là PHP, điểm bắt đầu thời gian khá phổ biến của nó.
Greg K

Câu trả lời:


65

Nó là tiêu chuẩn của thời gian Unix.

Unix time, hay POSIX time, là một hệ thống mô tả các điểm trong thời gian, được định nghĩa là số giây trôi qua kể từ Giờ Phối hợp Quốc tế (UTC) lúc nửa đêm của ngày 1 tháng 1 năm 1970, không tính giây nhuận.


5
Bạn có biết nếu Kernighan và Thompson đều bày tỏ lý do để chọn thời điểm đó ngoài "Đó là một con số hơi tròn trước khi chúng tôi bắt đầu xây dựng mọi thứ."
dmckee --- cựu điều hành kitten

Đó là ngày bắt đầu của một năm, nó ở múi giờ 0 (Zulu). Cả hai đều làm cho mã định dạng ngày tháng đơn giản hơn.
Donal Fellows

28
Không tính giây nhuận? Tôi không biết chi tiết đó. Sau khi suy nghĩ về nó một lúc, tôi có thể hiểu tại sao bạn lại làm theo cách đó, nhưng anh bạn. thế giới của tôi tan vỡ. 24 giây.
keturn

69

sử dụng ngày (ngày 1 tháng 1 năm 1970) làm tiêu chuẩn mặc định

Câu hỏi đưa ra hai giả định sai:

  • Tất cả việc theo dõi thời gian trong máy tính được thực hiện dưới dạng đếm từ năm 1970.
  • Theo dõi như vậy là tiêu chuẩn.

Hai kỷ nguyên Dozen

Thời gian trong máy tính không phải lúc nào cũng được theo dõi từ đầu năm 1970 UTC . Trong khi tham chiếu kỷ nguyên đó là phổ biến, các môi trường máy tính khác nhau trong nhiều thập kỷ đã sử dụng ít nhất gần hai chục kỷ nguyên . Một số là từ các thế kỷ khác. Chúng nằm trong khoảng từ năm 0 (không) đến năm 2001.

Ở đây có một ít.

0 tháng 1 năm 1 trước Công nguyên

Ngày 1 tháng 1 năm 1 sau Công nguyên

15 tháng 10, 1582

Ngày 1 tháng 1 năm 1601

31 tháng 12 năm 1840

17 tháng 11 năm 1858

30 tháng 12 năm 1899

31 tháng 12 năm 1899

Ngày 1 tháng 1 năm 1900

1 tháng 1 năm 1904

31 tháng 12 năm 1967

1 tháng 1 năm 1980

6 tháng 1 năm 1980

1 tháng 1 năm 2000

Ngày 1 tháng 1 năm 2001

Kỷ nguyên Unix Phổ biến, nhưng Không chiếm ưu thế

Đầu năm 1970 phổ biến, có lẽ do Unix sử dụng. Nhưng không có nghĩa là điều đó thống trị. Ví dụ:

ISO 8601

Giả sử kỷ nguyên đếm được sử dụng kỷ nguyên Unix đang mở ra một lỗ hổng lớn cho các lỗi. Con người không thể giải mã ngay lập tức số lượng như vậy, vì vậy các lỗi hoặc sự cố sẽ không dễ dàng bị gắn cờ khi gỡ lỗi và ghi nhật ký. Một vấn đề khác là sự không rõ ràng về mức độ chi tiết được giải thích bên dưới.

Tôi thực sự khuyên bạn nên thay vào đó tuần tự hóa các giá trị ngày-giờ dưới dạng chuỗi ISO 8601 rõ ràng để trao đổi dữ liệu thay vì một số nguyên đếm-kể từ kỷ nguyên: YYYY-MM-DDTHH:MM:SS.SSSZchẳng hạn như 2014-10-14T16:32:41.018Z.

Đếm những gì kể từ kỷ nguyên

Một vấn đề khác với tính năng theo dõi thời gian đếm kể từ kỷ nguyên là đơn vị thời gian, với ít nhất bốn cấp độ phân giải thường được sử dụng.

  • Giây
    Các phương tiện Unix ban đầu sử dụng toàn bộ giây, dẫn đến Vấn đề năm 2038 khi chúng ta đạt đến giới hạn giây kể từ năm 1970 nếu được lưu trữ dưới dạng số nguyên 32 bit.
  • Mili giây được
    sử dụng bởi các thư viện Java cũ hơn, bao gồm lớp java.util.Date đi kèm và thư viện Joda-Time .
  • Microseconds
    Được sử dụng bởi cơ sở dữ liệu như Postgres .
  • Nanoseconds được
    sử dụng bởi gói java.time mới trong Java 8.

Biểu đồ hiển thị các phần mềm khác nhau đếm từ kỷ nguyên theo giây, mili giây, micro giây hoặc nano giây.


1
Tôi tự hỏi kỷ nguyên thống trị tại thời điểm này là gì ... bạn có dựa trên dữ liệu không?
PascalVKooten

1
@PascalVKooten Nhiều kỷ nguyên khác nhau được sử dụng trong nhiều môi trường và hệ thống phần mềm khác nhau. Vì vậy, không có một kỷ nguyên thống trị. Quan điểm của tôi ở đây là đừng bao giờ giả định kỷ nguyên. Biết nguồn dữ liệu của bạn. Phương pháp tốt nhất là nguồn dữ liệu để tránh hoàn toàn vấn đề kỷ nguyên và chỉ sử dụng chuỗi ISO 8601, IMHO.
Basil Bourque

1
Cảm ơn vì đã trả lời. Tôi hiểu rằng có rất nhiều, nhưng tôi tò mò muốn biết liệu POSIX có phổ biến hơn theo thời gian hay không.
PascalVKooten

7

tại sao luôn là ngày 1 tháng 1 năm 1970, Bởi vì - 'Ngày 1 tháng 1 năm 1970' thường được gọi là "ngày kỷ nguyên" là ngày bắt đầu tính thời gian cho máy tính Unix và dấu thời gian đó được đánh dấu là '0'. Bất kỳ thời gian nào kể từ ngày đó đều được tính dựa trên số giây đã trôi qua. Nói một cách đơn giản hơn ... dấu thời gian của bất kỳ ngày nào sẽ chênh lệch tính bằng giây giữa ngày đó và 'ngày 1 tháng 1 năm 1970' Dấu thời gian chỉ là một số nguyên bắt đầu từ số '0' vào 'Nửa đêm ngày 1 tháng 1 năm 1970' và tiếp tục tăng dần bởi '1' khi mỗi giây trôi qua Để chuyển đổi dấu thời gian UNIX thành ngày tháng có thể đọc được, PHP và các ngôn ngữ nguồn mở khác cung cấp các hàm tích hợp sẵn.


5

Có lý do gì đằng sau việc sử dụng ngày (ngày 1 tháng 1 năm 1970) làm tiêu chuẩn cho thao tác thời gian?

Không có lý do gì quan trọng.

timeMô-đun của Python thư viện C. Hỏi Ken Thompson tại sao anh ấy lại chọn ngày đó để làm ngày định thần. Có lẽ đó là sinh nhật của ai đó.

Excel sử dụng hai kỷ nguyên khác nhau. Bất kỳ lý do nào tại sao các phiên bản excel khác nhau sử dụng các ngày khác nhau?

Ngoại trừ lập trình viên thực tế, không ai khác sẽ biết tại sao những loại quyết định đó lại được đưa ra.

Và ...

Nó không quan trọng tại sao ngày được chọn. Nó chỉ là.

Các nhà thiên văn sử dụng ngày khai tử của riêng họ: http://en.wikipedia.org/wiki/Epoch_(astronomy)

Tại sao? Một ngày phải được chọn để thực hiện phép toán. Bất kỳ ngày ngẫu nhiên sẽ hoạt động.

Một ngày trong quá khứ tránh số âm cho trường hợp chung.

Một số gói thông minh hơn sử dụng Gregorian năm 1. Bất kỳ lý do gì tại sao năm 1?
Có một lý do được đưa ra trong những cuốn sách như Tính toán lịch: nó đơn giản hơn về mặt toán học một chút.

Nhưng nếu bạn nghĩ về nó, sự khác biệt giữa 1/1/1 và 1/1/1970 chỉ là 1969, một sự bù đắp toán học tầm thường.


1
Nếu 1/1/1 được chọn, chúng ta sẽ hết giây (2 ^ 31). Như hiện tại, chúng ta phải đối mặt với một vấn đề giống như Y2K vào năm 2038 đối với hệ điều hành 32 bit. en.wikipedia.org/wiki/Year_2038_problem
Chris Nava

1
@Chris Nava: Những người sử dụng 1/1/1 tính ngày chứ không phải giây. 2 tỷ ngày là khoảng 5 triệu năm. Thường thì họ giữ một cặp (ngày, giờ) để tối đa hóa độ phân giải thời gian; chỉ có 86400 giây trong hầu hết các ngày.
S.Lott

@ S.Lott: Vâng. Tôi chỉ chỉ ra rằng vì hầu hết các phần mềm đều đếm giây (không phải phút) kể từ kỷ nguyên, ngày 1/1/1 cho đến nay là một ngày bắt đầu hợp lý. Do đó, một ngày gần đây được chọn làm kỷ nguyên máy tính (và bởi hiệp hội bắt đầu của cuộc cách mạng IT ;-).
Chris Nava

@Chris Nava: "hầu hết"? Tôi cho rằng "hầu hết" bạn có nghĩa là "Linux". Các hệ điều hành khác không hoạt động giống như Linux. Vấn đề là "hợp lý" và "tại sao 1/1/1970?" những câu hỏi không dễ trả lời; quan trọng nhất, câu trả lời không quan trọng. "hợp lý" là đúng, nhưng nó không phải là lý do tại sao . Lý do tại sao là điều chỉ Ken Thompson mới trả lời được.
S.Lott


2

Q) "Tại sao ngày được tính từ ngày 1 tháng 1 năm 1970?"

A) Nó phải gần đây nhất có thể, nhưng bao gồm một số quá khứ. Rất có thể không có lý do quan trọng nào khác vì nhiều người cũng cảm thấy như vậy.

Họ biết nó gây ra một vấn đề nếu họ đặt nó quá xa vào quá khứ và họ biết nó sẽ cho kết quả tiêu cực nếu nó là trong tương lai. Không cần phải đi sâu hơn về quá khứ vì các sự kiện rất có thể sẽ diễn ra trong tương lai.

Ghi chú: Mặt khác, các thị trấn có nhu cầu đặt các sự kiện vào quá khứ, vì họ đã có kiến ​​thức về rất nhiều quá khứ, để họ làm ra một cuốn lịch dài hạn. Chỉ để đặt tất cả các hiện tượng thường ngày trên lịch.

Dấu thời gian không có nghĩa là một lịch, nó là một Kỷ nguyên. Và tôi tin rằng các thị trưởng đã tạo ra lịch dài hạn của họ bằng cách sử dụng cùng một quan điểm. (có nghĩa là họ biết rõ rằng họ không có bất kỳ mối quan hệ nào với quá khứ, họ chỉ có nhu cầu nhìn nhận nó ở quy mô lớn hơn)


1

Có, C (và gia đình của nó). Đây là nơi mà Java cũng đã thực hiện nó.

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.