[英]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月沒有生效。 面容
這很可能是日光節約的問題。 它僅對resultDate和certDate執行此操作的原因是dateEnrolled是在8月,夏令時通常在9月下旬或10月初開始/結束。
使用apache.conf,.htaccess或ini_set()將date.timezone ini設置設置為應用程序的時區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.