2016-11-02 3 views
5

У меня есть строка, представляющая номер недели и год, и вы хотите вывести воскресение на этой неделе.Есть ли альтернатива Twig для DateTime :: createFromFormat (...)?

Пример в PHP:

$dateString = '502016'; 
$dateObject = DateTime::createFromFormat('WY', $dateString); 
echo $dateObject->format('Y-m-d'); 

Что-то вроде:

{{ published_at|format(date("Ymd"), 'd-m-Y') }} 

Возможно ли это в веткой?

+0

попытался использовать фильтр 'date'/функцию? –

+0

@RuslanOsmanov Как он узнает, что '112016' в формате недели? Я не могу дать исходный формат. – Peter

+1

действительно. Похоже, вы не можете использовать «дату» здесь. Но я думаю, вам лучше преобразовать '$ dateString' в формат, подходящий для' date'. В противном случае вам нужно будет написать свой собственный фильтр/функцию. –

ответ

2

я нашел то, что может помочь вам: overriding the built in twig date filter

Это создает новое расширение прут за то, что вы хотите :)

PS: В то заканчивается он возвращает PHP DateTime

<?php 
/* 
* Extension to provide updated date & date_modify filters along with an 
* updated date function which do not auto-convert strings of numbers to 
* a unix timestamp. 
* 
* Code within dateFilter(), modifyFilter() and dateFromString() extracted 
* from Twig/lib/Twig/Extension/Core.php which is (c) 2009 Fabien Potencier 
* and licensed as per https://github.com/twigphp/Twig/blob/master/LICENSE 
*/ 
namespace My\Twig\Extension; 

use Twig_Extension; 
use Twig_SimpleFilter; 
use Twig_SimpleFunction; 
use DateTime; 
use DateTimeInterface; 
use DateTimeImmutable; 

class DateExtension extends Twig_Extension 
{ 
    public function getName() 
    { 
     return 'my_date'; 
    } 

    public function getFilters() 
    { 
     return array(
      new Twig_SimpleFilter('date', [$this, 'dateFilter'], 
        ['needs_environment' => true]), 
      new Twig_SimpleFilter('date_modify', [$this, 'modifyFilter'], 
        ['needs_environment' => true]), 
     ); 
    } 

    public function getFunctions() 
    { 
     return array(
      new Twig_SimpleFunction('date', [$this, 'dateFromString'], 
        ['needs_environment' => true]), 
     ); 
    } 

    public function dateFilter($env, $date, $format = null, $timezone = null) 
    { 
     if (null === $format) { 
      $formats = $env->getExtension('core')->getDateFormat(); 
      $format = $date instanceof DateInterval ? $formats[1] : $formats[0]; 
     } 

     if ($date instanceof DateInterval) { 
      return $date->format($format); 
     } 

     return $this->dateFromString($env, $date, $timezone)->format($format); 
    } 

    public function modifyFilter($env, $date, $format = null, $timezone = null) 
    { 
     $date = $this->dateFromString($env, $date, false); 
     $date->modify($modifier); 

     return $date; 
    } 

    public function dateFromString($env, $date, $timezone) 
    { 
     // determine the timezone 
     if (!$timezone) { 
      $defaultTimezone = $env->getExtension('core')->getTimezone(); 
     } elseif (!$timezone instanceof DateTimeZone) { 
      $defaultTimezone = new DateTimeZone($timezone); 
     } else { 
      $defaultTimezone = $timezone; 
     } 

     // immutable dates 
     if ($date instanceof DateTimeImmutable) { 
      return false !== $timezone ? $date->setTimezone($defaultTimezone) : $date; 
     } 

     if ($date instanceof DateTime || $date instanceof DateTimeInterface) { 
      $date = clone $date; 
      if (false !== $timezone) { 
       $date->setTimezone($defaultTimezone); 
      } 

      return $date; 
     } 

     $date = new DateTime($date, $defaultTimezone); 
     if (false !== $timezone) { 
      $date->setTimezone($defaultTimezone); 
     } 

     return $date; 
    } 
} 

Этот класс просто регистрирует новые даты, фильтры date_modify и новую функцию даты для замены тегов в ядре Twig, а затем представляет собой прямую копию функций twig_date_format_filter, twig_date, _modify_filter и twig_date_converter с удаленной функциональностью.

Я также необходимо зарегистрировать это расширение с Twig_Environment с помощью:

$env->addExtension(new \My\Twig\Extension\DateExtension());

и я сделал.

{{ "20141216"|date('jS F Y') }} 
{{ "20141216"|date('jS F Y') }} 

теперь корректно выводит: 16 декабря 2014 16 декабря 2014

Хотя, это позор, я не могу просто переопределение twig_date_converter, я рад, что я могу переоформить релевантные Twig фильтры и функции.

+0

Я действительно думал о создании собственного расширения, но мне было интересно, существует ли существующее решение. – Peter

+1

Просто не публикуйте ссылки как ответ, так как URL-адрес может исчезнуть с течением времени – DarkBee

Смежные вопросы