Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当一些列被调整为DST时,如何处理datetime列?_Php_Mysql_Datetime_Dst - Fatal编程技术网

Php 当一些列被调整为DST时,如何处理datetime列?

Php 当一些列被调整为DST时,如何处理datetime列?,php,mysql,datetime,dst,Php,Mysql,Datetime,Dst,我正在比较MySQL和PHP中的datetime。在MySQL中,由于夏时制,2014年11月2日至2015年3月8日之间的时间增加了1 到目前为止,我有一些if语句来检查我是否需要在比较两个日期时间之前减去1小时。它只适用于2014/2015年,我想知道是否有办法在不硬编码确切日期的情况下,也适用于前几年 必须在PHP中动态进行比较,不能修改模式 以下是一些数据: 2014-10-15 18:00:00 2014-10-22 18:00:00 2014-10-29 18:00:00 2014-

我正在比较MySQL和PHP中的datetime。在MySQL中,由于夏时制,2014年11月2日至2015年3月8日之间的时间增加了1

到目前为止,我有一些if语句来检查我是否需要在比较两个日期时间之前减去1小时。它只适用于2014/2015年,我想知道是否有办法在不硬编码确切日期的情况下,也适用于前几年

必须在PHP中动态进行比较,不能修改模式

以下是一些数据:

2014-10-15 18:00:00

2014-10-22 18:00:00

2014-10-29 18:00:00

2014-11-05 19:00:00

2014-11-12 19:00:00

2014-11-19 19:00:00

所以,假设所有这些人都有相同的时间,为了比较他们,我需要在飞行中修改11月2日之后的时间

澄清: 我所需要做的就是把2014-10-29 18:00:00和2014-11-05 19:00:00这两个日期放在MYSQL中,并告诉它们是否只有相同的时间。由于DST,服务器将第二个条目增加到19:00:00小时,我需要用PHP处理它的内置内容

例如


我建议采取以下办法:

首先,将所有时间初始化为DateTime对象,并将正确的时区作为第二个参数传递:

$date1 = new DateTime('2014-03-01 12:00:00', new DateTimezone('Europe/Berlin'));
使用此对象,您可以使用防弹DateTime对象与其他对象进行比较

如果您想进行数学运算,例如与其他方法进行加法或减法运算,可以使用$date1->add和$date1->sub方法;但是,如果您只需要绝对偏移量,那么使用$date1->setTimeZoneNewDateTimeZone'UTC将每个DateTime对象转换为UTC可能会更容易,并且可以使用$date1->getTimestamp方法生成的简单UNIX时间戳

顺便说一下,请注意,以下初始化没有达到预期的结果:

$date1 = new DateTime('2014-03-01 12:00:00');
$date1->setTimezone(new DateTimezone('Europe/Berlin'));

事实上,这具有相反的效果–它将时间解释为UTC,然后将其转换为本地时间戳。

如果要查找两个日期之间的时差,可以执行以下操作:

 // Use whatever timezone you recorded the times in.
 $date1 = new DateTime("2014-10-15 19:00:00", new DateTimeZone("America/Los_Angeles"));
 $date2 = new DateTime("2014-11-19 18:00:00", new DateTimeZone("America/Los_Angeles"));

 // If you'd like to ignore the time zone differences, just switch the dates 
 // to a time zone without DST

 $utc = new DateTimeZone('UTC');
 $date1->setTimezone($utc);
 $date2->setTimezone($utc);

 echo "Time difference: " . $date1->diff($date2)->format('%H:%I:%S');

规则1不使用时区存储日期/时间;始终使用UTC。@Kermit我的规则1 real:始终包括TZ偏移;-以UTC保存会丢失我的经验中的重要信息。@user2864740-看来您不知道时间戳及其作用。我会记住您的建议。但是,我无法控制数据库中已经存储的任何信息。那么我该如何继续?@jump3r创建一个新列,然后更新以设置该列的调整时间(如果该列符合坏时区范围)。您好,谢谢您的回答,您能告诉我下一步该怎么做吗。因此,我有$date1和date2,上面有'2014-10-29 18:00:00'和'2014-11-05 19:00:00'以及我设置的任何时区。如何提取和比较两个对象的时间?我真的没有在文档中找到任何东西。如果只是关于比较,可以使用比较运算符或==;不要在DateTime对象上使用===。至于其他操作,“正确”的方法是使用diff方法并处理DateInterval对象。但是,如果两个DateTime对象具有相同的时区,您可以简单地减去它们的UNIX时间戳,这将给您以秒为单位的时间差。@Ixg-您不需要将DateTime对象转换为相同的时区来处理它们;偏移由库自动处理。另外-unix时间戳总是根据UTC时区定义的。@SamDufel我没有说必须转换为同一时区,我只是想说它使某些操作更直观。感谢您指出DateTime::getTimestamp总是返回UTC,我不知道。这仍然会给Sam带来1小时的差异,在我的情况下,我需要找到具有相同间隔的重复条目。时间变化不允许我在不使用if语句手动检查月和日以查看是否需要减去一个小时,然后再进行比较的情况下顺利地完成这项工作。时间变化越近,但不是减少时间的增量,而是将差值从1小时增加到1小时2hr@jump3r-你看日期的方向不对。11月2日之后,时间倒转1小时。11月1日19:00==11月2日18:00你说得对。。。我完蛋了。谢谢你的回答。
 // Use whatever timezone you recorded the times in.
 $date1 = new DateTime("2014-10-15 19:00:00", new DateTimeZone("America/Los_Angeles"));
 $date2 = new DateTime("2014-11-19 18:00:00", new DateTimeZone("America/Los_Angeles"));

 // If you'd like to ignore the time zone differences, just switch the dates 
 // to a time zone without DST

 $utc = new DateTimeZone('UTC');
 $date1->setTimezone($utc);
 $date2->setTimezone($utc);

 echo "Time difference: " . $date1->diff($date2)->format('%H:%I:%S');