簡體   English   中英

夏令時的PHP日期問題

[英]PHP date issues with daylight saving

我在一些PHP代碼中出現了一個非常奇怪的錯誤。 該頁面正在管理課程中的學生注冊。 頁面上是學生課程的表格,每一行都有很多日期:他們注冊的時間,完成的時間,通過評估的時間以及獲得證書的時間。

該表數據是由PHP生成的(從DB中繪制數據),而Javascript實際上是對該表的呈現。 PHP的輸出是JS代碼,看起來像這樣:

var e = new Enrolment();
e.contactId = 5801;
e.enrolId = 14834;
e.courseId = 3;
e.dateEnrolled = new Date(1219672800000);
e.dateCompleted = new Date(-1000);  // magic value meaning they haven't completed.
e.resultDate = new Date(1223647200000);
e.certDate = new Date(1223560800000);
e.result = 95;
e.passed = true;
enrolments[14834] = e;

在數據庫中,所有日期字段都存儲為DATE (不是DATETIME )字段。

錯誤是日期顯示為一天休息。 我懷疑這與服務器位於具有夏令時的區域有很大關系,而這里沒有任何東西(這意味着服務器時間減少了一個小時)。 這解釋了很多,尤其是如何在兩個不同的時區中完成數據准備和呈現。 也就是說:服務器正在向客戶說該人在8月15日午夜完成工作,而客戶則將其解釋為14日的11pm,因此顯示8月14日。

但這是令人困惑的部分:它僅對resultDate和certDate字段執行此操作! 我已將數據復制到本地服務器,發現生產服務器實際上僅針對這兩個字段發送了不同的時間戳記(一個時間戳記會減少1小時),而dateEnrolled字段卻是相同的。

以下是使用與數據庫完全相同的代碼和數據的輸出:

// local server (timezone GMT+1000)
e.dateEnrolled = new Date(1219672800000);   // 26 Aug 2008 00:00 +10:00
e.dateCompleted = new Date(-1000);
e.resultDate = new Date(1223647200000);     // 11 Oct 2008 00:00 +10:00
e.certDate = new Date(1223560800000);       // 10 Oct 2008 00:00 +10:00

// production server (timezone GMT+1100)
e.dateEnrolled = new Date(1219672800000);   // 26 Aug 2008 00:00 +10:00
e.dateCompleted = new Date(-1000);
e.resultDate = new Date(1223643600000);     // 10 Oct 2008 23:00 +10:00 **
e.certDate = new Date(1223557200000);       // 09 Oct 2008 23:00 +10:00 **

我可以理解這是否是由於不考慮夏令時的問題,但是請注意dateEnrolled的方式是一樣的嗎?

將MySQL日期轉換為unix時間戳的PHP代碼是這樣的:

list ($year, $month, $day) = explode ('-', $mysqlDT);
$timestamp = mktime (0,0,0, $month, $day, $year);

關於如何解決此問題的任何想法?

那是因為您使用的是特定於語言環境的mktime。 也就是說,將其轉換成秒數從1970-1-1 00:00:00 GMT,並且由1小時,一個時區偏移。

您還應該記住,JavaScript確實使用與瀏覽器相同的時區,而不使用網頁。

e.resultDate = new Date(year, month - 1, day);

這樣可以確保每個時區的每個觀看者的日期都相同。

或者,您可以使用gmmktime並在Date中使用UTC方法。

好的,我只是想出了為什么要取消一個日期而不是另一個日期。 夏令時在8月沒有生效。 面容

  1. 始終將日期/日期時間存儲在GMT / UTC中
  2. 仔細查看檢索這些值的查詢,與要調整的值有何不同?
  3. 如果不是,它們都是時間戳記還是日期或日期時間?

這很可能是日光節約的問題。 它僅對resultDate和certDate執行此操作的原因是dateEnrolled是在8月,夏令時通常在9月下旬或10月初開始/結束。

使用apache.conf,.htaccess或ini_set()將date.timezone ini設置設置為應用程序的時區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM