2011-10-15 19 views
5

Hướng dẫn sử dụng PHP nêu rõ rằng time() trả lại  " dấu thời gian UNIX hiện tại "  ­microtime() trả về  " dấu thời gian Unix hiện tại với micro giây " ʙ.Thời gian() có được nhận thức là bước nhảy vọt thứ hai không?

Tuy nhiên, các chức năng này có được bảo đảm để hoạt động như that of strictly conforming POSIX.1 systems không?

Cụ thể, hãy thực hiện các bước nhảy vọt theo cách sao cho đầu ra của time() & hairsp; | & hairsp; ­ microtime() nhảy ngược bởi 1 giây khi bắt đầu vào ngày hôm sau, (đó là cũng vào cuối những bước nhảy vọt thứ hai,) cho chúng tôi lặp đi lặp lại trở lại giá trị — như trái ngược với tươi giá trị duy nhất — suốt toàn bộ giây đầu tiên của ngày hôm sau? Ví dụ: nếu chúng tôi thăm dò ý kiến ​​time() & hairsp; | & hairsp; ­ microtime() mỗi micro giây trong suốt khoảng thời gian 1998 & # xfeff; -12 & # xfeff; -31 và 1999 & # xfeff; -01 & # xfeff; -01, sẽ có hai lần xuất hiện của mỗi giá trị trong phạm vi 915 & hairsp; & # xfeff; 148 & hairsp ; & # xfeff; 800 & # xff1c; & # xfeff; & # xff1d; x & # xff1c; 915 & hairsp; & # xfeff; 148 & hairsp; & # xfeff; 801?

+3

Bạn đã dành bao nhiêu giây cho việc này? –

+0

@Ash: dễ thương nhưng thông tin ... haha ​​ – prodigitalson

+3

@Ash bạn có nghĩa là giây SI hoặc giây mặt trời không? – Pacerier

Trả lời

8

PHP là ngôn ngữ máy chủ. Hàm time() sẽ giải quyết thời gian hệ thống của máy chủ đó. Nếu máy chủ đang chạy một daemon NTP sau đó nó sẽ được nhảy vọt thứ hai nhận thức và điều chỉnh cho phù hợp. PHP không có kiến ​​thức về điều này, nhưng hệ thống thì có.

1

time() chỉ trả lại Dấu thời gian UNIX. Điều này có nghĩa, rằng nó không bị ảnh hưởng bởi giây nhảy vọt (và như vậy), bởi vì bạn sẽ không bao giờ "mất" thời gian, chỉ vì ai đó đã quyết định nó. Chỉ các biểu diễn dạng văn bản (ví dụ: được tạo bằng cách sử dụng date()) bị ảnh hưởng.

+1

Tôi đoán câu hỏi nên là; là ngày() nhảy vọt thứ hai nhận thức? – Gerben

+0

Có, nhưng nó không phải là :) – KingCrunch

+0

@King Tôi có hiểu lầm điều gì đó không, bởi vì thời gian UNIX bị ảnh hưởng bởi giây nhảy vọt: http://en.wikipedia.org/wiki/Unix_time – Pacerier

10

Dấu thời gian UNIX, khi bạn nhận được nó từ thời gian() trong PHP, là một con thú đặc biệt. Mất một thời gian dài để hiểu điều này, nhưng điều xảy ra là dấu thời gian tăng trong giây nhảy vọt, và khi giây nhảy vọt kết thúc, dấu thời gian (nhưng không phải là UTC!) Nhảy lùi lại một giây.

này có một số ý nghĩa quan trọng:

  • Bạn có thể chuyển đổi luôn luôn chính xác từ UTC để một dấu thời gian UNIX
  • Bạn có thể không luôn (đối với tất cả các điểm trong thời gian) chuyển đổi từ dấu thời gian để UTC
  • Dấu thời gian Unix không tiếp giáp, tức là nó lùi lại. (Hoặc cách khác, nó vẫn giữ nguyên mà không tăng thêm 2 giây.)
  • Nếu bạn gặp lỗi chuyển đổi chuyển đổi từ dấu thời gian UNIX sang UTC, lỗi sẽ mất tối đa 2 giây. (Điều này có nghĩa là bạn có thể nhận được ngày sai mặc dù.)
  • Trong xem lại, dấu thời gian Unix sẽ xuất hiện tuyến tính. Điều này có nghĩa rằng nếu bạn đang lưu trữ dữ liệu chuỗi thời gian và bạn không quan tâm đến một hoặc hai giây mỗi năm được biểu diễn không chính xác, thì bạn có thể xem xét lưu trữ dữ liệu dấu thời gian liền kề.

Cách giải quyết

gì nếu timestamp Unix không nhảy Backed đột ngột cũng vẫn không thay đổi trong 2 giây? Đây chính xác là những gì Google đã thực hiện cho máy chủ của họ. Giải pháp của họ là slowly skew the time merely milliseconds at a time trong một thời gian dài, để thực hiện bước nhảy vọt thứ hai hầu như vô hình đối với các ứng dụng. (Theo như các ứng dụng và hệ điều hành trên máy chủ của Google có liên quan, giây nhảy vọt không còn được chèn bởi the IERS.)

+0

+1 chỉ dành cho liên kết đến giải pháp của Google. –

+0

@Prof., Câu trả lời của Angelom có ​​chính xác hơn không? Điều đó phụ thuộc vào nền tảng? – Pacerier

+0

@Pacerier, không chính xác nền tảng * * nhưng PHP phụ thuộc vào thời gian trên hệ điều hành được định cấu hình chính xác. –

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