как использовать часовой пояс в фильтре даты Twig? - PullRequest
4 голосов
/ 31 марта 2011

Я использую Twig и этот фильтр даты

http://www.twig -project.org / doc / templates.html # date

Видимо, они ищутЭкземпляры DateTime в параметре.

глядя на этот http://www.php.net/manual/en/datetime.construct.php

У меня проблемы с пониманием объекта php datetime и как использовать часовой пояс.

Учитывая, что я знаю основныеPHP и знакомы с простым веб-программированием, как я могу использовать его для отображения даты и времени с использованием фильтра даты Twig во время обслуживания часового пояса?

Если есть более простой способ сделать это при использовании фильтра даты, но НЕ используя объект datetime, я был бы открыт для него.

Меня беспокоит только то, что решение работает, а не «правильность» или «элегантность» решения.

Ответы [ 6 ]

17 голосов
/ 25 июля 2013

Фильтр «Дата» Twig принимает второй параметр: «часовой пояс».

Таким образом, вы можете легко отобразить любой часовой пояс, который вы хотите. Например:

{{ "now"|date("m/d/Y H:i", "Europe/Paris") }}
{{ "now"|date("m/d/Y H:i", "Asia/Calcutta") }}
{{ "now"|date("m/d/Y H:i", "Europe/Berlin") }}

Для получения дополнительной информации: http://twig.sensiolabs.org/doc/filters/date.html#timezone

2 голосов
/ 01 мая 2017

В сегодняшней версии это поддерживается в конфигурационном файле приложения Symfony:

twig:
    date:
        timezone: Asia/Tokyo

http://symfony.com/blog/new-in-symfony-2-7-default-date-and-number-format-configuration

2 голосов
/ 31 марта 2011

Я думаю, вы могли неправильно прочитать документацию.

Фильтр даты принимает любой формат даты, поддерживаемый экземплярами DateTime и DateTime.

Это означает, что вы можете просто передать такие вещи, как "2011-01-20 12:00:00" ИЛИ настоящий объект DateTime.

Но вам не нужно иметь дело с объектом, если вы не хотите делать.

Теперь, если вам нужна эта строка для отображения в определенном часовом поясе, я бы установил этот часовой пояс в php, прежде чем передать его ветке

$x = new DateTime("2010-01-01 12:00:00");
$x->setTimezone(new DateTimeZone("The Timezone you need"));
// pass to twig
1 голос
/ 19 апреля 2018

Я знаю, что вопрос старый, но это для справки.По умолчанию Twig собирается использовать часовой пояс по умолчанию, заданный в файле php ini или в приложении глобально, или объявленный в twig.

если вы передаете объект datetime в фильтр даты с часовым поясом, то выможет передавать false в качестве второго аргумента в фильтре даты.

{{ dateForSomething | date('theFormatIWant', false) }}

см. документацию дата ветки

0 голосов
/ 03 августа 2018

Что мне сработало, так это добавление нового фильтра, поэтому он всегда смотрит на часовой пояс внутри объекта DateTime.Ниже приведен пример с объектом DateTime в качестве параметра.

Возможно, я что-то упустил из-за того, что не понимаю, почему Twig игнорирует часть часового пояса DateTime и использует глобальную часть по умолчанию.

Врасширение фильтров:

public function getFilters()
{
    return array(
    (...)
    new \Twig_SimpleFilter('date_tz', array($this, 'dateTzFilter')),
    );
}

и

public function dateTzFilter(\DateTime $dateTime)
{
    return $datTime->format('desired_format');
}
0 голосов
/ 31 марта 2011

код, который работает для меня был

/**
originally the $post['created'] contains the value stored in database. 
this value was inserted assuming UTC format.
Best to do something like date_default_timezone_set('UTC'); 
which sets UTC application-wide 
**/

$time = new DateTime($post['created']);
$time->setTimezone(new DateTimeZone('Asia/Singapore')); // if you want Asia/Singapore

// probably the DateTimeZone has to be retrieved from database 
// since it could be user setting
// you can find the list of legit DateTimeZones in
// http://www.php.net/manual/en/timezones.php

$post['created'] = $time;

/**
Then $post is passed to Twig
**/
...