#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
там лучше.