2016-11-02 16 views
5

私は週番号と年を表す文字列を持っており、今週の日曜日を出力したいと思います。 PHPでDateTime :: createFromFormat(...)のtwigの代替はありますか?

例:のような

$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

ここで 'date'を使うことはできないようです。しかし、あなたは '$ dateString'を' date'に適した形式に変換するべきだと思います。それ以外の場合は、独自のフィルタ/関数を記述する必要があります。 –

答えて

2

私はあなたを助けることができる何かが見つかりました:それはあなたが:)

PS欲しいもののために新しい小枝の拡張を作成だoverriding the built in twig date filter

を:その後で、それは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、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') }} 

は正しく出力されます、それは私ができる恥だけでなく、 オーバーライドtwig_date_converterながら2014年12月16日2014年12月16日

だ、私は再登録ができることをうれしく思います related Twigフィルタと機能。

+0

私は独自の拡張機能を作成することを考えましたが、既存のソリューションがあるかどうか疑問に思っていました。 – Peter

+1

URLは時間の経過とともに消滅する可能性があるので、リンクを回答として投稿しないでください – DarkBee

関連する問題