#drupal #drupal-7 #drupal-modules
#drupal #drupal-7 #drupal-модули
Вопрос:
- Установка Drupal 7.8
- Для часового пояса сайта в настройках региона задано значение America/New_York
- У меня есть этот код в обратном вызове страницы
- Проблема возникает на нескольких серверах
format_date() не настраивает смещение часового пояса ни на часовой пояс сайта по умолчанию, ни даже когда я добавляю строку часового пояса в качестве аргумента.
Ниже приведен код, а в нижней части кода — закомментированный вывод. Есть 2 примера использования format_date, и последний пример — это то, что мне нужно было сделать, чтобы получить правильное время для отображения.
Есть идеи о том, как заставить format_date() работать с часовым поясом?
header('content-type: text/plain');
// utc_str as it would come from the db of a date field
$utc_str = '2011-09-01 14:00:00';
// converting to a unix timestamp
$timestamp = strtotime($utc_str);
// first print with format_date, note default site timezone is America/New_York
print 'format_date($timestamp, "custom", "Y-m-d h:s:i"): '. format_date($timestamp, 'custom', 'Y-m-d h:s:i') ."n";
// next print date by actually setting the timezone string in the argument
// Result:
$tz_str = 'America/New_York';
print 'format_date($timestamp, "custom", "Y-m-d h:s:i", "America/NewYork"): '. format_date($timestamp, 'custom', 'Y-m-d h:s:i', $tz_str) ."n";
// this is the only way i could get it working
$date = new DateTime($product->field_class_date['und'][0]['value'], new DateTimeZone(date_default_timezone_get()));
$offset = $date->getOffset();
$formatted = date('Y-m-d h:s:i', ($timestamp $offset));
print $formatted;
/** This is the output
format_date($timestamp, "custom", "Y-m-d h:s:i"): 2011-09-01 02:00:00
format_date($timestamp, "custom", "Y-m-d h:s:i", "America/NewYork"): 2011-09-01 02:00:00
2011-09-01 10:00:00
*/
Комментарии:
1. Ага. Прежде всего, я думаю, что документация Drupal неверна, поскольку она указывает, что при выборе «Часовой пояс даты» дата не преобразуется, а часовой пояс сохраняется. Он сохраняет часовой пояс, но он явно преобразует дату в UTC. Который затем вам нужно преобразовать обратно со смещением, используя кучу кода, если вы хотите использовать его в шаблоне. Ваш код работает отлично, но это неправильно обрабатывается в Drupal.
Ответ №1:
Способ, которым вы это решили, правильный. Если вы используете PHP 5.3 или выше, вы можете использовать метод DateTime::add и просто добавить смещение, не создавая из него временную метку, как я сделал ниже.
$utcTimezone = new DateTimeZone('UTC');
$timezone = new DateTimeZone('America/New_York');
$dateTime = new DateTime('2011-09-01 14:00:00', $timezone);
$offset = $timezone->getOffset($dateTime);
print date('Y-m-d H:i:s', $dateTime->format('U') $offset);