【问题标题】:calculate day difference between two unix timestamps at boundary values计算边界值处的两个 unix 时间戳之间的天差
【发布时间】:2014-10-29 06:19:22
【问题描述】:

我针对日期 02/09/2014 11:30pm 和 03/09/2014 12:00am 创建了两个时间戳。

这些时间戳之间只有 30 分钟的差异,但由于日期已从 10 月 2 日更改为 10 月 3 日,因此应以一天计算。

我的代码是

$current_time_zone = isset($_COOKIE['IANA_timezone_key']) ? $_COOKIE['IANA_timezone_key'] : "";
$d1 = new DateTime(date('Y-m-d'), timezone_open($current_time_zone));
$d2 = new DateTime(date('Y-m-d'), timezone_open($current_time_zone));
$d1->setTimestamp($row["transitions_date"]); // $row["transitions_date"] has timestamp value
$d2->setTimestamp($curr_transition_in_date); // $curr_transition_in_date has timestamp value
$diff = date_diff($d1, $d2);
$day_difference = $diff->days;  

我们将不胜感激。

【问题讨论】:

  • 您的意思是要为您的案例打印“1 天”?
  • @sithu 在上述情况下,它返回 0 作为天差,但如果日期不同,它应该返回“1”天。
  • 我认为你应该重新考虑你的方法;如果我们扩展您的断言“由于日期从 10 月 2 日更改为 10 月 3 日,它应该以一天计算”,您还必须说 X 年的 12 月 31 日和 1 月 1 日之间存在一年的差异X+1 年。说有“一天”的差异是指“大于或等于一天的持续时间”。

标签: php date datetime unix-timestamp datetime-format


【解决方案1】:

您无法期望与date_diff() 的返回对象的期望天差,因为它基于实际时差。最简单的方法是自己调整。

$d1 = new DateTime(date('Y-m-d'));
$d2 = new DateTime(date('Y-m-d'));
$d1->setTimestamp($row["transitions_date"]);
$d2->setTimestamp($curr_transition_in_date);

$diff = date_diff($d1, $d2);
$day_difference = $diff->days;

echo 'Actual output from date_diff: '.$day_difference; 
echo '<br>';
if($d2->format('H:i:s') < $d1->format('H:i:s')){
    $day_difference++;
}
echo 'Corrected output: '.$day_difference;

Demo 1 表示不同的日期,但月份和年份相同。
Demo 2 表示同一天,但月份和年份不同。
Demo 3 用于相同的输出。

【讨论】:

  • 不要认为这会起作用,因为如果您有同一天但不同的月份/年份,您的 if 语句将“失败”。
  • 既然已经有了 DateTime 对象,为什么还要再次转换时间戳date('d', timestamp)
  • @Glavić 检查this code 然后你就会得到答案。
  • @Glavić 是的,这就是我没有使用 DateTime 对象并再次使用 date() 函数的原因。尽管$d1 具有date 属性,但我不确定为什么会出现错误。
  • @Glavić,对于您的第一个问题,我的回答可能不完整。我可以更新答案,但你已经在你的答案中做到了。我不是在复制你的。最终,您的答案与原来的完全不同:)
猜你喜欢
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多