繁体   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