我想计算一个月的时间"在php

时间:2016-08-09 13:47:03

标签: php date datetime

以下代码可帮助我将数据库中的数据投影到当天的内部管理站点。

由于我们在多个时区,我们使用UTC时间作为基本时间功能,但由于我们的办公室位于加利福尼亚州,我们希望日期实际为= ($date)'hours' - 8,因为PST为8小时背后。

我们使用以下逻辑来显示"前一天"如果它是"提前一天" UTC时间,但同一天我们的时间很好,然而,在每个月的最后一天下午4点,我们的所有数据都被隐藏了。

<?php 

$date = getDate();

if ($date['hours'] < 8) {
    $dateDay = $date['mday']-1;
} else {
    $dateDay = $date['mday'];
}

$dateMonth = $date['mon'];
// last day of month
// $dateMonth = $date['mon'] - 1;
$dateYear = $date['year'];
$dateTime = $dateYear . "-" . $dateMonth . '-' . $dateDay . ' 08:00:00';

所以,这个&#39;如果&#39;功能非常适合展示真实的日子。&#34;它说的是,如果UTC小时&lt; 8,然后它实际上是昨天,因为UTC时间凌晨3点实际上是太平洋标准时间前一天晚上7点。

我想知道的是,如果有办法跟踪&#34;月份时间&#34;,那么我可以使用相同的&#39; if&#39;读取的功能&#34;如果我们的月份时间少于8个小时,那么它实际上仍然是上个月。&#34;

无论月份是28天,30天还是31天,它都能正常运作。这样的逻辑是否存在?

2 个答案:

答案 0 :(得分:1)

我认为这是处理它的最佳方式:

<?php
    $date = new DateTime('2016-08-08', new DateTimeZone('UTC'));
    echo $date->format('Y-m-d H:i:sP') . "\n";

    $date->setTimezone(new DateTimeZone('America/Los_Angeles'));
    echo $date->format('Y-m-d H:i:sP') . "\n";
?>

答案 1 :(得分:1)

您可以使用DateTime::subDateTime::modify方法为您保留正确的月份:

$now = new DateTime(getDay()); // supposing getDate() returns something that can be parsed with DateTime constructor

// Unless using DateTimeImmutable, cloning is needed to prevent altering the original object
$min = clone ($now); 
$min->modify('-8 hours');
// alternatively $min->sub(new DateInterval('PT8H'));

if ($now->format('m') !== $min->format('m')) {
    // month differs
}