Наличие неожиданных результатов при использовании strtotime с часовым поясом и расчетами. Мой PHP установлен на UTC. strtotime("-6 days 00:00:00 America/Chicago");
, кажется, дает неожиданные результаты. Я подумал, что, предоставив часовой пояс, он будет «вычислен в этом часовом поясе», но это не так.
В моем примере я ожидаю, что результаты будут одинаковыми, независимо от часового пояса PHP по умолчанию, поскольку в strtotime используется «Америка / Чикаго». Вместо этого он, кажется, берет текущий день (согласно часовому поясу по умолчанию) и вычитает дни, а затем вычисляет 00:00:00 в предоставленном часовом поясе.
Я неправильно форматирую?
Я прошу прощения за грязный код, но это всего лишь пример, демонстрирующий, о чем я говорю.
date_default_timezone_set("UTC");
echo date_default_timezone_get();
echo "</br>";
echo "</br>";
echo convertTS(time(), "America/Chicago");
echo "</br>";
echo "</br>";
$test = strtotime("-6 days 00:00:00 America/Chicago");
echo $test;
echo "</br>";
echo convertTS($test, "America/Chicago");
echo "</br>";
$test = strtotime("-7 days 00:00:00 America/Chicago");
echo $test;
echo "</br>";
echo convertTS($test, "America/Chicago");
echo "</br>";
echo "</br>";
echo "-----------------";
echo "</br>";
echo "</br>";
///now in America/Chicago
date_default_timezone_set("America/Chicago");
echo date_default_timezone_get();
echo "</br>";
echo "</br>";
echo convertTS(time(), "America/Chicago");
echo "</br>";
echo "</br>";
$test = strtotime("-6 days 00:00:00 America/Chicago");
echo $test;
echo "</br>";
echo convertTS($test, "America/Chicago");
echo "</br>";
$test = strtotime("-7 days 00:00:00 America/Chicago");
echo $test;
echo "</br>";
echo convertTS($test, "America/Chicago");
function convertTS($timestamp, $timezone)
{
if( empty($timestamp) )
{
return 'n/a';
}
else
{
//output the time
$dt = new DateTime('@'.$timestamp);
$dt->setTimeZone(new DateTimeZone($timezone));
return $dt->format('D, m/d/y @ g:i:s a T');
}
}
результат вышеупомянутого в то время, когда я управлял этим:
UTC
Fri, 01/04/19 @ 11:39:15 pm CST
1546149600
Sun, 12/30/18 @ 12:00:00 am CST
1546063200
Sat, 12/29/18 @ 12:00:00 am CST
-----------------
America/Chicago
Fri, 01/04/19 @ 11:39:15 pm CST
1546063200
Sat, 12/29/18 @ 12:00:00 am CST
1545976800
Fri, 12/28/18 @ 12:00:00 am CST
Я сделал песочницу, чтобы воссоздать эту проблему постоянно здесь . Разница заключается в том, что временная метка предоставляется вместо использования time()
, чтобы показать, как часовой пояс по умолчанию влияет на результаты в зависимости от времени текущего дня.