下面的代码帮助我将数据库中的数据投影到我们当前的内部管理站点上。
由于我们在多个时区,我们使用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';
因此,这个'if'函数可以很好地显示真正的"日"。它说的是,如果UTC小时<8,那么它实际上是昨天,因为UTC时间凌晨3点实际上是太平洋标准时间前一天晚上7点。
我想知道的是,如果有一种方法来跟踪"月小时",所以我可以使用相同的"if"函数,读"如果我们进入一个月少于8个UTC小时,它实际上仍然是上个月。"
这样,不管这个月是28天、30天还是31天,它都可以工作。这样的逻辑存在吗?
我认为这是最好的处理方法:
<?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";
?>
您可以使用DateTime::sub
或DateTime::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
}