【问题标题】:php date subtraction using strtotime function not returning correct length of time使用strtotime函数的php日期减法不返回正确的时间长度
【发布时间】:2011-10-22 20:14:18
【问题描述】:

我正在将基于 PHP (v 5.2.17) 的报告转换为 SSRS。

我正在尝试编写一个像 php 文件一样减去日期的查询。

日期计算要么完全匹配,要么相差 3600 秒

  $timediff=strtotime(date("Y-m-d"))-strtotime("03/29/2007");
  print $timediff;  // 137635200 

  select (trunc(sysdate) - to_date('03/29/2007','MM/DD/YYYY'))*60*60*24 from dual
  -- returns 137635200 - matches


  $timediff=strtotime(date("Y-m-d"))-strtotime("11/23/2009");
  print $timediff;  // 53823600 

  select (trunc(sysdate) - to_date('11/23/2009','MM/DD/YYYY'))*60*60*24 from dual
  -- returns 53827200 - doesnt match - off by 3600

我搜索了 stackoverflow,发现下面这个例子听起来很像(2009 年 11 月 23 日是星期一,今天 8 月 8 日也是如此,但差别不大)PHP Strtotime erratic function

我的假设是php计算错误,oracle是正确的。

你说什么? ;-)

谢谢!

【问题讨论】:

  • 3600 = 一个小时。为什么会提前一个小时?也许其中一个包含夏令时更改,而一个不包含?
  • PHP服务器的时区和Oracle服务器的时区是否一致?

标签: php oracle strtotime


【解决方案1】:

没有看到确切的值,我怀疑它是因为其中一个正在调整夏令时,而另一个没有。世界大部分地区在 3 月期间更改为夏令时/夏令时。因此,在您的第一个示例中,两个日期都在相同的 GMT 偏移量中,但在第二个(11 月)它们不是。

因此,您的一个平台(可能是 Oracle)正在考虑这一小时班次,而另一个则没有。

【讨论】:

  • 要查找 PHP 时区,您可以使用date_default_timezone_get()。世界上有些地方没有夏令时,有些地方有。
【解决方案2】:

3600 = 一个小时,所以可能是时区差异?

【讨论】:

    【解决方案3】:

    53827200 = ( 623 * 60*60*24 )

    所以 53827200 正好是 24 小时的 623 天。

    53823600 是 622.958333 天或 622 天(24 小时)加上 23 小时。

    对于给定的权利定义,两者都是正确的。

    【讨论】:

    • 是的,但是两种计算的结果应该相同。
    • 您的问题并未说明由于夏令时您希望如何适应更长/更短的日子。如果/当您决定时,可以调整 PHP 或 Oracle 语法以提出正确的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    相关资源
    最近更新 更多