私が持っているいくつかの 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
) フィールドとして保存されます。
バグは、日付が 1 日オフとして表示されていることです。これは、サーバーが夏時間のある地域にあることに大きく関係していると思われますが、ここでは夏時間はありません (つまり、サーバー時間は 1 時間ずれています)。これは、特にデータの準備とレンダリングが 2 つの異なるタイムゾーンでどのように行われているかを説明しています。つまり、サーバーは、8 月 15 日の午前 0 時に完了したことをクライアントに伝え、クライアントはそれを 14 日の午後 11 時と解釈し、8 月 14 日を表示します。
しかし、ここで紛らわしい部分があります。これは、resultDate および certDate フィールドに対してのみ行っていることです。データをローカル サーバーにコピーしたところ、本番サーバーが実際にはこれら 2 つのフィールドに対して異なるタイムスタンプ (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);
これを修正する方法についてのアイデアはありますか?