服务器之间的日期差异
Difference in dates between servers
我想知道为什么我一直得到 PHP 的完全无效计算。
我有这样的代码:
echo floor((strtotime("2017-03-27") - strtotime("2017-03-24"))/86400);
其中一台服务器 returns:3
(大约 3 天)
在另一台服务器上 returns:2
! (2.9583333333333 天?)为什么会有差异?
您的服务器可能位于两个不同的时区。将天数转换为小时数,您将得到一小时的差异。
3 days * 24 hours/1 day = 72 hours
2.958333 days * 24 hours/1 day = 71 hours
或者,使用更好的方法:
编辑 我更新了代码以使用与 OP 相同的日期。它 returns 3,它应该如此,而且我非常有信心它会在您测试的任何服务器上做到这一点。
<?php
$date1 = date_create('2017-03-27');
$date2 = date_create('2017-03-24');
$interval = date_diff($date1,$date2);
echo $interval->format('%a');
?>
由于有些人难以接受这是由于特定于 TZ 的 DST 更改所致,请提供一些证据:
function poc($tz_str) {
$tz = new DateTimeZone($tz_str);
$start = (new DateTime('2017-03-24', $tz))->format('U');
$end = (new DateTime('2017-03-27', $tz))->format('U');
return [$tz_str, $end - $start, ( $end - $start ) / 86400];
}
var_dump(
poc('UTC'),
poc('Europe/London'),
poc('America/New_York')
);
输出:
array(3) {
[0]=> string(3) "UTC"
[1]=> int(259200)
[2]=> int(3)
}
array(3) {
[0]=> string(13) "Europe/London"
[1]=> int(255600)
[2]=> float(2.9583333333333)
}
array(3) {
[0]=> string(16) "America/New_York"
[1]=> int(259200)
[2]=> int(3)
}
- UTC 没有 DST,不受影响。
- 东半球大部分地区在 3 月 26 日更改夏令时,受影响。
- 西半球大部分地区在 3 月 12 日更改了夏令时,不受影响。
就是说,不要对 Unix 时间戳进行手动日期计算。
我想知道为什么我一直得到 PHP 的完全无效计算。
我有这样的代码:
echo floor((strtotime("2017-03-27") - strtotime("2017-03-24"))/86400);
其中一台服务器 returns:3
(大约 3 天)
在另一台服务器上 returns:2
! (2.9583333333333 天?)为什么会有差异?
您的服务器可能位于两个不同的时区。将天数转换为小时数,您将得到一小时的差异。
3 days * 24 hours/1 day = 72 hours
2.958333 days * 24 hours/1 day = 71 hours
或者,使用更好的方法:
编辑 我更新了代码以使用与 OP 相同的日期。它 returns 3,它应该如此,而且我非常有信心它会在您测试的任何服务器上做到这一点。
<?php
$date1 = date_create('2017-03-27');
$date2 = date_create('2017-03-24');
$interval = date_diff($date1,$date2);
echo $interval->format('%a');
?>
由于有些人难以接受这是由于特定于 TZ 的 DST 更改所致,请提供一些证据:
function poc($tz_str) {
$tz = new DateTimeZone($tz_str);
$start = (new DateTime('2017-03-24', $tz))->format('U');
$end = (new DateTime('2017-03-27', $tz))->format('U');
return [$tz_str, $end - $start, ( $end - $start ) / 86400];
}
var_dump(
poc('UTC'),
poc('Europe/London'),
poc('America/New_York')
);
输出:
array(3) {
[0]=> string(3) "UTC"
[1]=> int(259200)
[2]=> int(3)
}
array(3) {
[0]=> string(13) "Europe/London"
[1]=> int(255600)
[2]=> float(2.9583333333333)
}
array(3) {
[0]=> string(16) "America/New_York"
[1]=> int(259200)
[2]=> int(3)
}
- UTC 没有 DST,不受影响。
- 东半球大部分地区在 3 月 26 日更改夏令时,受影响。
- 西半球大部分地区在 3 月 12 日更改了夏令时,不受影响。
就是说,不要对 Unix 时间戳进行手动日期计算。