【发布时间】:2020-06-16 10:09:29
【问题描述】:
我希望了解为什么不能信任这个简单的 DateTime 操作 (2020-07-01)->diff(2020-07-31)。
<?php
$timeZones = ['GMT', 'Europe/Paris', 'America/Denver', 'Asia/Qatar', 'Australia/Sydney'];
echo('Doing (2020-07-01)->diff(2020-07-31)' . "\n\n");
foreach ($timeZones as $timeZone) {
date_default_timezone_set($timeZone);
$startDate = new \DateTime('2020-07-01');
$calcDateA = (new \DateTime('2020-07-01'))->modify('+1 month -1 day');
$calcDateB = (new \DateTime('2020-07-01'))->modify('+30 days');
$calcDateC = new \DateTime('2020-07-31');
$diffA = $startDate->diff($calcDateA);
$diffB = $startDate->diff($calcDateB);
$diffC = $startDate->diff($calcDateC);
echo("Using $timeZone\n");
echo('days (A): ' . $diffA->d . "\n");
echo('months (A): ' . $diffA->m . "\n");
echo('days (B): ' . $diffB->d . "\n");
echo('months (B): ' . $diffB->m . "\n");
echo('days (C): ' . $diffC->d . "\n");
echo('months (C): ' . $diffC->m . "\n\n");
}
此代码在任何 PHP 版本中执行时,都会输出以下内容:
Doing (2020-07-01)->diff(2020-07-31)
Using GMT
days (A): 30
months (A): 0
days (B): 30
months (B): 0
days (C): 30
months (C): 0
Using Europe/Paris
days (A): 0
months (A): 1
days (B): 0
months (B): 1
days (C): 0
months (C): 1
Using America/Denver
days (A): 30
months (A): 0
days (B): 30
months (B): 0
days (C): 30
months (C): 0
Using Asia/Qatar
days (A): 0
months (A): 1
days (B): 0
months (B): 1
days (C): 0
months (C): 1
Using Australia/Sydney
days (A): 0
months (A): 1
days (B): 0
months (B): 1
days (C): 0
months (C): 1
我感觉内部计算是使用 UTC 进行的,有人忘记补偿时区。任何人都可以确认?
谢谢。
【问题讨论】: