PHP 错误的 unix 时间戳
PHP wrong unix timestamp
当我尝试计算两个日期之间的天数时发现了一些问题。
为了快速调试我的代码,我使用 http://sandbox.onlinephpfunctions.com/ 和 PHP 版本 7.4.0
问题:
$date = new DateTime( '2018-02-28' );
$date2 = new DateTime( '2018-03-12' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
var_dump($diff/(60*60*24)); //float(11.958333333333)
如您所见 - 我设置了日期并计算了日期之间的 unixtimestamp-diff。
然后我尝试在两个日期之间的差异时查找日期!= 86400.
$date = new DateTime( '2020-03-08' );
$date2 = new DateTime( '2020-03-09' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
var_dump($diff/(60*60*24)); //float(0.95833333333333)
然后我找到从 2010 年开始的所有天数:
$secInDay = 60 * 60 * 24;
$start_date = strtotime('2010-01-01');
$end_date = strtotime('2021-01-01');
while($start_date<$end_date) {
$next_date = strtotime('+1 day', $start_date);
$diff = ($next_date - $start_date) / $secInDay;
if ($diff !== 1) {
var_dump(date('d.m.Y', $start_date) . ' -> ' . date('d.m.Y', $next_date));
}
$start_date = strtotime('+1 day', $start_date);
}
Result:
string(24) "14.03.2010 -> 15.03.2010"
string(24) "07.11.2010 -> 08.11.2010"
string(24) "13.03.2011 -> 14.03.2011"
string(24) "06.11.2011 -> 07.11.2011"
string(24) "11.03.2012 -> 12.03.2012"
string(24) "04.11.2012 -> 05.11.2012"
string(24) "10.03.2013 -> 11.03.2013"
string(24) "03.11.2013 -> 04.11.2013"
string(24) "09.03.2014 -> 10.03.2014"
string(24) "02.11.2014 -> 03.11.2014"
string(24) "08.03.2015 -> 09.03.2015"
string(24) "01.11.2015 -> 02.11.2015"
string(24) "13.03.2016 -> 14.03.2016"
string(24) "06.11.2016 -> 07.11.2016"
string(24) "12.03.2017 -> 13.03.2017"
string(24) "05.11.2017 -> 06.11.2017"
string(24) "11.03.2018 -> 12.03.2018"
string(24) "04.11.2018 -> 05.11.2018"
string(24) "10.03.2019 -> 11.03.2019"
string(24) "03.11.2019 -> 04.11.2019"
string(24) "08.03.2020 -> 09.03.2020"
string(24) "01.11.2020 -> 02.11.2020"
所以我的主要问题 - 为什么 PHP 得到错误的当前日期的 unix 时间戳?
您可以使用此功能更改默认 UTC:
date_default_timezone_set('America/Los_Angeles');
https://www.php.net/manual/en/function.date-default-timezone-set.php
或者直接从您的网络服务器编辑您的 INI 配置文件。
https://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
如果您像这样使用 DateTime class 并计算满足闰年的间隔
function days_between( $start, $end )
{
// Put the 2 dates into DateTime objects
$start = new DateTime($start);
$end = new DateTime($end);
// Create a DateInterval object using diff() method
$interval = $end->diff($start);
// Format the result as an integer, representing number of days
return $interval->format('%a');
}
#not leap year
echo days_between('2019-02-27', '2019-02-27') . PHP_EOL; // 0
echo days_between('2019-02-27', '2019-02-28') . PHP_EOL; // 1
echo days_between('2019-02-27', '2019-02-29') . PHP_EOL; // 2 (there is no 29th
echo days_between('2019-02-27', '2019-03-01') . PHP_EOL; // 2
echo PHP_EOL;
#Leap Year
echo days_between('2020-02-27', '2020-02-27') . PHP_EOL; // 0
echo days_between('2020-02-27', '2020-02-28') . PHP_EOL; // 1
echo days_between('2020-02-27', '2020-02-29') . PHP_EOL; // 2
echo days_between('2020-02-27', '2020-03-01') . PHP_EOL; // 3
结果
0
1
2
2
0
1
2
3
您的算法找到从 winter/summer 时间到当前时区 summer/winter 时间的转换天数。这几天都没有24小时了
俄罗斯不再知道夏令时了。有
date_default_timezone_set('Europe/Moscow');
在第一行中,您将获得您所在地区的结果。 Try it self.
更新:
您使用 DateTime-Objects 获得了正确的结果:
date_default_timezone_set('Europe/Moscow');
$diff = date_create('28.03.2010')->diff(date_create('29.03.2010'))->days;
echo $diff; //1
当我尝试计算两个日期之间的天数时发现了一些问题。
为了快速调试我的代码,我使用 http://sandbox.onlinephpfunctions.com/ 和 PHP 版本 7.4.0
问题:
$date = new DateTime( '2018-02-28' );
$date2 = new DateTime( '2018-03-12' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
var_dump($diff/(60*60*24)); //float(11.958333333333)
如您所见 - 我设置了日期并计算了日期之间的 unixtimestamp-diff。
然后我尝试在两个日期之间的差异时查找日期!= 86400.
$date = new DateTime( '2020-03-08' );
$date2 = new DateTime( '2020-03-09' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
var_dump($diff/(60*60*24)); //float(0.95833333333333)
然后我找到从 2010 年开始的所有天数:
$secInDay = 60 * 60 * 24;
$start_date = strtotime('2010-01-01');
$end_date = strtotime('2021-01-01');
while($start_date<$end_date) {
$next_date = strtotime('+1 day', $start_date);
$diff = ($next_date - $start_date) / $secInDay;
if ($diff !== 1) {
var_dump(date('d.m.Y', $start_date) . ' -> ' . date('d.m.Y', $next_date));
}
$start_date = strtotime('+1 day', $start_date);
}
Result:
string(24) "14.03.2010 -> 15.03.2010"
string(24) "07.11.2010 -> 08.11.2010"
string(24) "13.03.2011 -> 14.03.2011"
string(24) "06.11.2011 -> 07.11.2011"
string(24) "11.03.2012 -> 12.03.2012"
string(24) "04.11.2012 -> 05.11.2012"
string(24) "10.03.2013 -> 11.03.2013"
string(24) "03.11.2013 -> 04.11.2013"
string(24) "09.03.2014 -> 10.03.2014"
string(24) "02.11.2014 -> 03.11.2014"
string(24) "08.03.2015 -> 09.03.2015"
string(24) "01.11.2015 -> 02.11.2015"
string(24) "13.03.2016 -> 14.03.2016"
string(24) "06.11.2016 -> 07.11.2016"
string(24) "12.03.2017 -> 13.03.2017"
string(24) "05.11.2017 -> 06.11.2017"
string(24) "11.03.2018 -> 12.03.2018"
string(24) "04.11.2018 -> 05.11.2018"
string(24) "10.03.2019 -> 11.03.2019"
string(24) "03.11.2019 -> 04.11.2019"
string(24) "08.03.2020 -> 09.03.2020"
string(24) "01.11.2020 -> 02.11.2020"
所以我的主要问题 - 为什么 PHP 得到错误的当前日期的 unix 时间戳?
您可以使用此功能更改默认 UTC:
date_default_timezone_set('America/Los_Angeles');
https://www.php.net/manual/en/function.date-default-timezone-set.php
或者直接从您的网络服务器编辑您的 INI 配置文件。 https://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
如果您像这样使用 DateTime class 并计算满足闰年的间隔
function days_between( $start, $end )
{
// Put the 2 dates into DateTime objects
$start = new DateTime($start);
$end = new DateTime($end);
// Create a DateInterval object using diff() method
$interval = $end->diff($start);
// Format the result as an integer, representing number of days
return $interval->format('%a');
}
#not leap year
echo days_between('2019-02-27', '2019-02-27') . PHP_EOL; // 0
echo days_between('2019-02-27', '2019-02-28') . PHP_EOL; // 1
echo days_between('2019-02-27', '2019-02-29') . PHP_EOL; // 2 (there is no 29th
echo days_between('2019-02-27', '2019-03-01') . PHP_EOL; // 2
echo PHP_EOL;
#Leap Year
echo days_between('2020-02-27', '2020-02-27') . PHP_EOL; // 0
echo days_between('2020-02-27', '2020-02-28') . PHP_EOL; // 1
echo days_between('2020-02-27', '2020-02-29') . PHP_EOL; // 2
echo days_between('2020-02-27', '2020-03-01') . PHP_EOL; // 3
结果
0
1
2
2
0
1
2
3
您的算法找到从 winter/summer 时间到当前时区 summer/winter 时间的转换天数。这几天都没有24小时了
俄罗斯不再知道夏令时了。有
date_default_timezone_set('Europe/Moscow');
在第一行中,您将获得您所在地区的结果。 Try it self.
更新:
您使用 DateTime-Objects 获得了正确的结果:
date_default_timezone_set('Europe/Moscow');
$diff = date_create('28.03.2010')->diff(date_create('29.03.2010'))->days;
echo $diff; //1