Показать правильное время UTC и смещение для времени начала события в реальном времени с использованием часового пояса Нью — Йорка

#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