[英]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.