#php #date #datetime
Вопрос:
Я хочу показать время начала события с правильным смещением UTC (часовой пояс Нью-Йорка), поэтому обычно оно показывает это:
June 01, 2001 @ 20:00 UTC-4
Но если событие начнется в летнее время, вывод события автоматически покажет UTC-5, так как в 8 вечера в Нью-Йорке будет UTC-5:
December 01, 2001 @ 20:00 UTC-5
Есть ли способ сделать это?
С датой и временем самое близкое, что я могу получить, — это не показывать часовой пояс:
'F j, Y @ G:i'
Ответ №1:
У вас есть несколько вариантов, но ни один из них не является именно тем, что вы ищете. Возможно, вам придется немного манипулировать.
С форматерами по умолчанию у вас есть O
( 0200) P
или p
( 02:00) и T
(EST, MDT, 05). Видишь https://www.php.net/manual/en/datetime.format.php в разделе идентификаторы часовых поясов. Это не добавит UTC, но вы можете добавить его в себя , например 'F j, Y @ G:i UTCP'
, что в настоящее время дает мне "September 21, 2021 @ 7:51 UTC-04:00"
.
Другой вариант, если вам нужен только номер, — это отформатировать его самостоятельно. С классом DateTime у вас есть getOffset()
, который возвращает смещение в секундах. Немного подсчитав, вы можете получить это число
$date = new DateTime();
$offset = $date->getOffset() / 60 / 60; // Divide by 60 seconds to a minute, 60 minutes to an hour
$formatted_date = $date->format('F j, Y @ G:i'). " UTC$offset";
// "September 21, 2021 @ 7:52 UTC-4"
Ответ №2:
Вы можете получить часы, доставленные вам с помощью опции формата даты и времени «P», а затем отформатировать желаемый результат с помощью sprintf.
function tzUTC(DateTimeInterface $date)
{
$tzHours = (int)$date->format('P');
return sprintf('UTC% 1d',$tzHours);
}
Пример:
$date = new DateTime('now',new DateTimezone('America/New_York'));
echo $date->format('F j, Y @ G:i ').tzUTC($date);
Выход:
September 21, 2021 @ 9:10 UTC-4