以下代码可帮助我将数据库中的数据投影到当天的内部管理站点。
由于我们在多个时区,我们使用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天,它都能正常运作。这样的逻辑是否存在?
答案 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::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
}