因此,我在脚本中使用datetime和diff方法进行月份差异计算,并创建了测试脚本来向您展示我的问题。
在我的服务器上运行(家中的远程Linux和本地Windows,时区为欧洲/华沙):
echo "StartDate\tEndDate\tMonthNum\tDifference\n";
for($i = 1; $i <= 12; $i++){
$filters['date_from'] = "2020-$i-01";
$filters['date_to'] = date("Y-m-t", strtotime("2020-$i-01"));
$datetime1 = new DateTime($filters['date_from']);
$datetime2 = new DateTime($filters['date_to']);
$difference = $datetime1->diff($datetime2);
$end = $difference->m;
echo "{$filters['date_from']}\t{$filters['date_to']}\t" . $i . "\t$end\n";
}
,结果是PHP 7.1.29和PHP 7.4.1:
StartDate EndDate MonthNum Difference
2020-1-01 2020-01-31 1 0
2020-2-01 2020-02-29 2 0
2020-3-01 2020-03-31 3 1
2020-4-01 2020-04-30 4 0
2020-5-01 2020-05-31 5 1
2020-6-01 2020-06-30 6 0
2020-7-01 2020-07-31 7 1
2020-8-01 2020-08-31 8 0
2020-9-01 2020-09-30 9 0
2020-10-01 2020-10-31 10 1
2020-11-01 2020-11-30 11 0
2020-12-01 2020-12-31 12 1
所以您看到diff显示出0或1个飞蛾差,如果一个月超过30天,则为1,如果少于30天,则为0。
所以我在http://sandbox.onlinephpfunctions.com/上测试了这段代码,结果却有所不同:
StartDate EndDate MonthNum Difference
2020-1-01 2020-01-31 1 0
2020-2-01 2020-02-29 2 0
2020-3-01 2020-03-31 3 0
2020-4-01 2020-04-30 4 0
2020-5-01 2020-05-31 5 0
2020-6-01 2020-06-30 6 0
2020-7-01 2020-07-31 7 0
2020-8-01 2020-08-31 8 0
2020-9-01 2020-09-30 9 0
2020-10-01 2020-10-31 10 0
2020-11-01 2020-11-30 11 0
2020-12-01 2020-12-31 12 0
所有月份之间的差异为0个月,因此工作正常,也许有人知道我的服务器可能出了什么问题?
答案 0 :(得分:1)
是的,这是一个错误。从月的第一天到该月的最后一天(00:00)的差值应始终返回0个月,因为缺少最后一天。 1个月是从该月的第一天(00:00)到下个月的第一天的00:00。 该错误是由不正确的时区转换为UTC引起的。如果使用时区UTC作为解决方法,则可以正确计算月份。
$tz = new dateTimeZone('UTC');
for($i = 1; $i <= 12; $i++){
$n = $i+1;
$dateFrom = "2020-$i-01";
$dateTo = $n == 13 ? "2021-01-01" : "2020-$n-01";
$diff = date_create($dateFrom,$tz)->diff(date_create($dateTo,$tz));
echo $dateFrom." to ".$dateTo." = ".$diff->m. " month or ".$diff->days." days<br>\n";
}
输出:
2020-1-01 to 2020-2-01 = 1 month or 31 days
2020-2-01 to 2020-3-01 = 1 month or 29 days
2020-3-01 to 2020-4-01 = 1 month or 31 days
2020-4-01 to 2020-5-01 = 1 month or 30 days
2020-5-01 to 2020-6-01 = 1 month or 31 days
2020-6-01 to 2020-7-01 = 1 month or 30 days
2020-7-01 to 2020-8-01 = 1 month or 31 days
2020-8-01 to 2020-9-01 = 1 month or 31 days
2020-9-01 to 2020-10-01 = 1 month or 30 days
2020-10-01 to 2020-11-01 = 1 month or 31 days
2020-11-01 to 2020-12-01 = 1 month or 30 days
2020-12-01 to 2021-01-01 = 1 month or 31 days