Я хочу показать формат даты, например: 10月09日, 周三
(что означает 10/9, ср.)
и мои данные – это время UNIX, например [message.time]: 1380813820000
так это то, что я делаю в ветке:
{{ (message.time/1000)|date("m月d日, 周w") }}
Но это показывает мне: 10月09日,周3
, потому что дата «w» – это цифры, а не китайский текст.
так что я могу что-то сделать Twig, чтобы обсудить текстовый формат?
благодаря
Основная проблема заключается в том, что Twig использует метод DateTime::format
, который не поддерживает локали или (насколько мне известно) любые другие типы функций для перевода имен в будние дни.
Существует три решения:
strftime
, который поддерживает локали (и, следовательно, локализованные имена в будние дни). Кроме того, чтобы использовать ваше предпочтительное решение в Twig-шаблоне, вам необходимо расширить функциональность Twig.
Следующий (довольно большой) код реализует решение strftime
:
<?php // inspired by phpdude: // https://github.com/fabpot/twig/issues/378#issuecomment-4698225 class DateTimeHelper_Twig extends Twig_Extension { public function getFilters() { return array( 'datetime' => new Twig_Filter_Method($this, 'datetime', array('needs_environment' => true)), ); } // This uses `strftime` which makes use of the locale. The format is not // compatible with the one of date() or DateTime::format(). public function datetime(Twig_Environment $env, $date, $format = "%B %e, %Y %H:%M", $timezone = null) { $date = twig_date_converter($env, $date, $timezone); return strftime($format, $date->getTimestamp()); } public function getName() { return 'DateTimeHelper'; } } $loader = new Twig_Loader_String(); $twig = new Twig_Environment($loader); // Call the setlocale before you use the `datetime` in your templates. // This only needs to be done once per request. // If you already have a locale configured in your environment, // you can replace this with setlocale(LC_TIME, ""); - that way the // locale of your environment is used. setlocale(LC_TIME, "zh_CN.UTF-8"); // Add the extension to Twig like that: $twig->addExtension(new DateTimeHelper_Twig()); $message = array('time' => time() * 1000); // use the `datetime` filter with %a which gets replaced by the short weekday name of // the current locale. echo $twig->render('{{ (message.time/1000)|datetime("%m月%d日, 周%a") }}', array('message' => $message)), PHP_EOL;
Этот код показывает 10月09日, 周三
в моей системе (после установки локального пакета debian locales-all
;-)).
Конечно, в локалях есть список ограничений, о которых вы, вероятно, должны знать:
setlocale
работают разные / дают разные результаты). Ознакомьтесь с руководством по PHP для setlocale
Если вы можете использовать внутренние расширения и «Twig-extensions» -пакет, вы должны использовать localizeddate
вместо date
:
// add the extension like that $twig->addExtension(new Twig_Extensions_Extension_Intl()); $message = array('time' => time() * 1000); echo $twig->render('{{ (message.time/1000)|localizeddate("none", "none", "zh", null, "MM月dd日, eee") }}', array('message' => $message)), PHP_EOL;
Этот код также показывает 10月09日, 周三
– он даже автоматически добавляет 周 -thing.
Конечно, формат даты здесь также отличается – ознакомьтесь с руководством пользователя ICU .
Вы можете попробовать этот код, если функция setlocale не может работать в вашей системе.
<?php require_once dirname(__FILE__).'/vendor/autoload.php'; $loader = new Twig_Loader_String(); $twig = new Twig_Environment($loader); $twig->addFilter(new Twig_SimpleFilter('format_date', function($value) { $weekdays = array('日','一','二','三','四','五','六'); return sprintf("%s, 周%s", date("m月d日"), $weekdays[date("w")]); })); echo $twig->render('{{ time_at | format_date }}', array( 'time_at' => 1380813820000/1000 ));
Я нашел replace
быстрого фильтра, вот фрагмент кода:
<div class="date"><span>{{ (create_time/1000)|date("m月d日,周D")|replace({'Mon':'一','Tue':'二','Wed':'三','Thu':'四','Fri':'五','Sat':'六','Sun':'日'}) }}</span></div>