Преобразование смещения часового пояса в знак сохранения часов и минут

#php #mysql #magento #zend-framework #timezone

#php #mysql #magento #zend-framework #Часовой пояс

Вопрос:

Предположим, у меня есть смещение, подобное этому:

 $secOffset =  -28800 
  

Мне это нужно для преобразования в формат, который можно использовать с функцией MYSQL convert_tz()

Если я использую, gmdate("h:i", secOffset) я получил 16:00 , это почти правильно, но в нем отсутствует минус - (это очень важно)

Альтернативный подход:

Предположим, у меня есть строка времени America/Los_Angeles , и я хочу преобразовать смещение, полезное для функции MYSQL convert_tz()

Конечный ожидаемый результат — это смещение от GMT, поэтому задается часовой пояс.
Например, при таком часовом поясе, как America/Los_Angeles , вывод должен быть: −08:00

Я работаю на Magento / Zend, поэтому, если какая-либо доступная функция есть на Zend, я могу принять ответ на ее основе.

Комментарии:

1. Объясните свой вопрос, чего вы хотите на самом деле и каков ваш ожидаемый результат?

2. хорошо , готово … Я думаю, теперь все более понятно

3. Идентификатор часового пояса не обязательно соответствует одному смещению. Это зависит от времени года (DST).

4. Я думаю, что это соответствует точному смещению для точной даты, мне нужно иметь вывод, который является динамическим для today (или лучше для момента запуска кода)

Ответ №1:

Для этого следует использовать классы DateTimeZone и DateInterval :

 $tzid = 'America/Los_Angeles';

$tz = new DateTimeZone($tzid);
$date = new DateTime('now', $tz);

// create a new date offset by the timezone offset
// gets the interval as hours amp; minutes
$offset = $tz->getOffset($date) . ' seconds';
$dateOffset = clone $date;
$dateOffset->sub(DateInterval::createFromDateString($offset));

$interval = $dateOffset->diff($date);
$formatted = $interval->format('%R%H:%I');
  

Это немного запутанно, так как сначала вы получаете смещение часового пояса в секундах, а затем используете DateTime для преобразования этого интервала в часы / минуты.

Комментарии:

1. выглядит работающим, но также немного сложным … (больше java, чем php 🙂 в любом случае спасибо

2. Если вам нужен какой-нибудь дерьмовый процедурный код, попробуйте ($offset<0?'-':' ') . gmdate('h:i',abs($offset)); 🙂

3. Спасибо @cmbuckley хороший код. Но не должен ли вместо этого быть часовой формат H:i ? При h:i смещении 0 это приведет к 12:00 …!

4. Я упоминал, что это был дерьмовый код 😉 но да, вы правы, H:i там лучше.