2008-10-07 51 views

Trả lời

81

Tuy nhiên bạn chọn lưu trữ dấu thời gian, điều quan trọng là tránh các sự cố giải thích vùng và các vấn đề về thời gian bù đắp. Dấu thời gian Unix được diễn giải giống nhau bất kể vùng nào và được tính từ cùng một thời điểm bất kể múi giờ - đây là những điều tốt.

Hãy coi chừng lưu trữ dấu thời gian là các chuỗi không rõ ràng như ngày 01/02/2008, vì điều đó có thể được hiểu là ngày 02 tháng 1 năm 2008 hoặc ngày 01 tháng 2 năm 2008, tùy thuộc vào ngôn ngữ.

Khi lưu trữ giờ/phút/giây, điều quan trọng là phải biết "giờ"/phút/giây nào được chỉ định. Bạn có thể làm điều này bằng cách bao gồm thông tin múi giờ (không cần thiết cho một dấu thời gian Unix, vì nó được giả định là UTC). Tuy nhiên, lưu ý rằng các dấu thời gian của Unix không thể biểu diễn duy nhất một số khoảnh khắc trong thời gian: khi có một giây nhảy vọt trong UTC, dấu thời gian Unix không thay đổi, vì vậy cả 23:59:60 giờ UTC và 00:00:00 ngày có cùng một biểu diễn Unix. Vì vậy, nếu bạn thực sự cần một giây hoặc độ phân giải tốt hơn, hãy xem xét một định dạng khác.

Nếu bạn thích định dạng lưu trữ dễ đọc hơn con người so với dấu thời gian của Unix, hãy xem xét ISO 8601.

Một kỹ thuật giúp duy trì mọi thứ liên tiếp là lưu trữ ngày dưới dạng UTC và chỉ áp dụng múi giờ hoặc chênh lệch DST khi hiển thị ngày cho người dùng.

13

32 bit Unix timestamps will overflow in a few years (January 2038), để có thể xem xét. Tôi thường sử dụng định dạng DATETIME trong SQL, là YYYY-MM-DD HH: MM: SS với thời gian là một đồng hồ 24 giờ. Tôi cố gắng xuất ra các tệp có cùng định dạng, chỉ để làm cho cuộc sống của tôi dễ dàng hơn.

+0

2038 cho 32 bit nhưng hầu hết các hệ thống hiện nay là 64bit –

+5

là 2038 - http://en.wikipedia.org/wiki/Year_2038_problem – warren

+1

Cố định và liên kết. @mgb - Có, mặc dù tôi nghĩ rằng các hệ thống nhúng sẽ gặp nhiều rắc rối nhất. –

6

Bạn cần lưu trữ độ tuổi nào và độ phân giải nào? Nếu bạn cần micro giây hoặc ngày trong time_t đá có thể không phải là tốt nhất. Vì mục đích kinh doanh chung, nó khá tốt (giả sử 64bit)

+6

Họ đã không _have_ ngày trong thời kỳ đồ đá, phải không? –

+35

Chắc chắn họ đã làm - bạn gặp một cô gái tốt, câu lạc bộ của mình trên đầu và kéo cô trở lại hang động của bạn - rất lãng mạn .... –

+1

Bạn cần phải tính toán ngày/lần trong thời gian dài cho những thứ như các sự kiện thiên văn (eclipses vv) hệ thống này (julian ngày) bắt đầu khoảng 5000bc –

2

kiểu thời gian (time_t + micro giây) nếu tôi cần độ chính xác phụ, chỉ khác time_t. Bạn có thể sử dụng giá trị số nguyên 64 bit để lưu trữ time_t * 1000000 + usec và bạn không bị tràn trong hơn +/- 292.000 năm.

+0

Đó là một ý tưởng rất hay. –

0

Một timestamp là bascially:

  • một điểm khác biệt trong thời gian

Và như một điểm trong thời gian có độ phân giải bất tận, điều quan trọng về cách chọn một định dạng timestamp là: có nó đủ độ phân giải?

Đối với hầu hết các ứng dụng tôi đã có, nano giây là đủ. Vì vậy, Java Timestamp đã có độ phân giải phù hợp với tôi cho đến nay.

4

Tùy thuộc vào những gì bạn cần dấu thời gian.

Dấu thời gian unix không thể đại diện cho thời gian 1 giây sau 2008-12-31T23: 59: 59Z. Nếu bạn thực hiện '2009-01-01T09: 00: 00' - '2008-12-31T09: 00: 00' với dấu thời gian unix kết quả là KHÔNG đúng: sẽ có giây nhảy vọt giữa hai ngày đó và chúng được phân cách bằng 86401 giây (không phải 86400 dưới dạng dấu thời gian unix sẽ cho bạn biết).

Ngoài ra và những gì các phản ứng khác nói, vâng - unix timestamps là con đường để đi :)

4

Một dấu thời gian không phải là một ý tưởng tốt về cơ sở dữ liệu, bởi vì họ không dùng tiết kiệm ánh sáng ban ngày hoặc hiện tại giờ địa phương vào tài khoản. Trên MySQL, tốt hơn là lưu trữ nó dưới dạng thời gian và sau đó sử dụng MySQL date and time functions để truy xuất các phần bạn muốn hoặc so sánh với các ngày khác.

24

Nếu bạn đang lưu trữ một tệp nhật ký, xin vui lòng cho tình yêu của pete làm cho nó một cái gì đó con người có thể đọc được và lexically-sortable. Ví dụ:

2008-10-07 09:47:02.

+1

7 năm về ... Con người có thể đọc được là tuyệt vời và tôi tất cả vì nó nhưng ngày trong ví dụ này là mơ hồ. Nếu bạn thực sự cần biết khi có điều gì đó xảy ra, bạn cần thông tin về múi giờ để đi với một cái gì đó như 2008-10-07T09: 47: 02Z để bạn có thể đọc được con người và một thời điểm chính xác. –

+3

Nó không mơ hồ. Không có '???? - ?? - ??'định dạng ngày không phải là' yyyy-mm-dd', tức là ISO-8601 ngoại trừ "T". –

+2

Tôi thích cách bạn mất một phút để nhấp vào nút bài đăng – Samus

1

UNIX Dấu thời gian Vấn đề 32 bit có vẻ khá khó chịu đối với người dùng nhập ngày trong tương lai vào năm 2038+.

Hoặc sử dụng trình tự DATETIME cho MySQL hoặc lưu trữ ngày của bạn dưới dạng BIGINT (8) unsigned (tối đa: 18 nghìn tỷ) hoặc FLOAT để bạn có thể nhập số lớn. Sau đó, bạn không thể sử dụng ví dụ như hàm date() của PHP vì nó chỉ cho phép các số nguyên làm tham số (được giới hạn bởi các hệ thống 32 bit).

Giải pháp tôi tìm thấy là sử dụng chức năng PHP 5.2.0. Here's the DateTime PHP solution.

Không cần thay đổi định dạng UNIX_TIMESTAMP. Miễn là bạn có BIGINT (8) không được coi là lưu trữ MySQL của bạn cho dấu thời gian. Bạn sẽ không bị giới hạn bởi hệ thống 32 bit nữa.

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