如何在不除以86400(60*60*24)的情况下计算php中两个unix时间戳之间的间隔

如何在不除以86400(60*60*24)的情况下计算php中两个unix时间戳之间的间隔,php,strtotime,Php,Strtotime,我有2个unix时间戳,我在亚洲太平洋/奥克兰时区(GMT+12,DaylightSavings=GMT+13) 我想计算两个时间戳之间的间隔天数,其中一个在夏令时内,另一个不在夏令时内 我的示例日期是: 2009年2月7日(1233925200)至2010年9月21日(1284985360)(不包括21日) 这里写着591天: 让我们计算一下,这是我的时间戳(都是基于奥克兰00:00时间) 所以我需要591。我不想使用“汇总”解决方案 有没有像strotime这样可靠的方法,但用于计算日期间隔

我有2个unix时间戳,我在亚洲太平洋/奥克兰时区(GMT+12,DaylightSavings=GMT+13)

我想计算两个时间戳之间的间隔天数,其中一个在夏令时内,另一个不在夏令时内

我的示例日期是:

2009年2月7日(1233925200)
至2010年9月21日(1284985360)(不包括21日) 这里写着591天:

让我们计算一下,这是我的时间戳(都是基于奥克兰00:00时间)

所以我需要591。我不想使用“汇总”解决方案

有没有像strotime这样可靠的方法,但用于计算日期间隔,最好不需要PHP5.3+最小值

编辑:需要澄清一下,我正在使用strotime来获取这些时间戳,我以为那是UTC


EDIT2:我相信我已经找到了问题所在。虽然我的结束日期是9月21日,但实际上我使用time()来获取我的结束日期,time()返回了错误的时间戳,也许它不能解释GMT+12,不管我将time()切换为strotime(date('d M Y'),它返回了正确的时间戳!eureka 591天除以86400既可靠又简单。我不知道任何特殊函数,也看不出它们存在的原因。

正确的Unix(POSIX)时间戳是UTC格式的,因此您从已经错误的值开始。您将面临一场艰苦的战斗,因为API通常会假定时间戳是UTC。最好解决这个问题,然后简单的除法将给出正确的结果。

在计算差异之前,计算两个时间戳的完整天数:

floor(1284985360 / 86400) - floor(1233925200 / 86400)
您的结果总是一个整数

由于您正在使用
strotime
获取这些时间戳,请指定时间
00:00:00+0000
以始终获取86400的倍数:

strtotime($str.' 00:00:00+0000')

为什么你不愿意使用显而易见的简单除法解决方案?@you:因为它给出了一个错误的结果?@you:舍入一个错误的结果以得到预期的结果不是我对“工作”的定义。这些时间戳有些问题。在我的系统上
(strotime('2010-09-21')-strotime('2009-02-07'))/86400==591
。请记住,Unix时间戳应该在GMT时区。
date('Y-m-dh:i:s',1284985360)='2010-09-20 12:22:40'
date('Y-m-dh:i:s',1233925200)='2009-02-06 13:00:00'
因此,您需要对结果进行取整是可以理解的。在5.3中,新的日期时间($t1)->diff(新的日期时间($t2)简单明了。但是OP要求5.3之前版本的解决方案。这就是为什么要用UTC保存时间戳的原因。dude im使用strottime来获取这些时间戳,是不是UTCStrotime与时区无关。@mizipzor:strotime与时区有很大关系-它将人类可读的日期转换为时间戳,它必须使用特定的时区来解释日期。我不知道它是否是UTC,我只是在运行strotime,所以如果你说strotime生成的是GMT而不是UNIX(POSIX),那么我想我是完蛋了。你似乎很博学,我想你是说除了5.3+方法之外没有可靠的方法了???@fatjoze:确切地说,说strotime在特定时区生成时间戳是错误的。它总是生成UTC,问题是它使用什么时区来解释人类可读的日期参数。在您的例子中,这似乎是不正确的,因为您列出的时间戳与UTC或奥克兰时间的00:00不一致。您可以通过date\u default\u timezone\u set()设置默认时区@fatjoze:再看一眼,您的时间戳似乎对应于悉尼的00:00-是否可能是您的服务器所在的位置以及它们被配置为使用的默认时区?非常感谢Michael,非常有经验的支持,我的时间戳应该是新西兰奥克兰,我用set_default_date_timezone(忘记了实际名称)来相应地设置我的时区,所以yea不确定为什么它显示悉尼时间。你住在悉尼吗?哈哈。尽管如此,我还是按照Gumbos的解决方案,将两个数字分别除以86400,然后再减去。到目前为止似乎还管用。@Gumbo先生,你真是个天才。这是最后一种使用unix时间戳进行“间隔天数”计算的方法,无需
DateTime
类(对于我们这些没有PHP5.3的人)。
strtotime($str.' 00:00:00+0000')