Php 一天25小时

Php 一天25小时,php,datetime,Php,Datetime,我在PHP中遇到了奇怪的行为: (strtotime("2017-11-05 00:00:00") - strtotime("2017-11-06 00:00:00")) / 24//3600 (strtotime("2017-11-06 00:00:00") - strtotime("2017-11-05 00:00:00")) / 24//3750 (strtotime("2017-11-07 00:00:00") - strtotime("2017-11-06 00:00:00")) /

我在PHP中遇到了奇怪的行为:

(strtotime("2017-11-05 00:00:00") - strtotime("2017-11-06 00:00:00")) / 24//3600
(strtotime("2017-11-06 00:00:00") - strtotime("2017-11-05 00:00:00")) / 24//3750
(strtotime("2017-11-07 00:00:00") - strtotime("2017-11-06 00:00:00")) / 24//3600
正如我发现的,它与从夏季到冬季的时间转移有关()。这是正确的行为吗?我在文档中看不到任何与此相关的内容。有人有联系吗

至少,在java中,它可以像我期望的那样工作:

System.out.println(((new Date(2017, 11, 6).getTime()) - (new Date(2017, 11, 5).getTime())) / 24);//3600000

现在是一个问题。我如何定义,这一天是25小时,我应该用特殊的方法来处理这一天?

虽然我不能回答你问题的PHP部分,但我可以更正你的Java代码

tl;博士 PT25H

PT24小时

UTC中的一天长度始终为24小时。某些时区中的一天可能是23、24、25或其他小时数,甚至可能包括部分(分数)小时

细节 您对Java使用了错误的类,并且忽略了时区这一关键问题。
java.util.Date
类令人困惑、麻烦,幸运的是,它现在已经过时了。现代的java.time类取代了那些旧的日期时间类

您在示例代码中忽略了时区这一关键问题。传统的
Date
类始终使用UTC,但您关心的是
美国/纽约
时区。您的代码计算的是通用24小时工作日(UTC)的24小时,而实际上
美国/纽约的2017-11-05是25小时而不是24小时

您的Java示例代码对我来说毫无意义,因为您正在计算以毫秒为单位的持续时间,然后除以24。我看不出这种划分有什么帮助

一般24小时工作日的毫秒数=(24*60*60*1000)=86400000。这是您的代码使用
java.util.Date
返回的数字,如果我们将除法去掉24

long millis = ((new Date(2017, 11, 6).getTime()) - (new Date(2017, 11, 5).getTime())) ;
System.out.println( millis ); 
86400000

你看

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

LocalDate ld = LocalDate.of( 2017 , Month.NOVEMBER , 5 ) ;
时区 时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”。 以
大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

ZoneDateTime
让java.time确定一天中的第一个时刻。不要假设一天从00:00开始。夏时制(DST)等异常意味着一天可能从01:00开始

ZonedDateTime start = ld.atStartOfDay( z ) ;
通常,半开放式方法最适合定义时间跨度。在这种方法中,开始是包容性的,而结束是排他性的。因此,一整天的定义是从一天的第一个时刻开始,一直到第二天的第一个时刻,但不包括第二天的第一个时刻

ZonedDateTime stop = ld.plusDays( 1 ).atStartOfDay( z ) ;
计算当天的时间长度,11月5日在纽约区

Duration d = Duration.between( start , stop ) ;
PT25H

所以,是的,我们看到一天是25小时长的,因为DST的转换

看这个

Duration::toString
的输出在中


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的课程,如、、和。

是的,这是正确的行为:一年中的某些日子有25小时,其他日子有23小时。。。。这完全取决于您的时区,以及夏令时是否适用。最简单的处理方法是在内部完全使用UTC时区,并调整到用户的时区,仅用于实际显示或输入。您可以检查是否使用夏令时,并相应地调整代码:
if(date('I',time()){//In DST}否则{//Not In DST}
谢谢,
date('I'
看起来不错。Unix时间戳是UTC,但PHP会根据PHP.ini中的时区设置(或通过代码修改)调整其显示。通常,使用具有时区意识的DateTime对象是一个更好的主意,您可以更好地控制它们如何处理时区差异以及与夏令时的转换
ZonedDateTime start = ld.atStartOfDay( z ) ;
ZonedDateTime stop = ld.plusDays( 1 ).atStartOfDay( z ) ;
Duration d = Duration.between( start , stop ) ;