Bir Dal şablonunda bir DateTime nesnesi oluşturma


215

Varlıklarımdaki alanlardan biri "datetime" değişkenidir.

Bir tarayıcıda oluşturmak için bu alanı bir dizeye nasıl dönüştürebilirim?

İşte bir kod snippet'i:

{% for game in games %}
    ...
        <td> {{game.gameTeamIdOne.teamName}} </td>
        <td> {{game.gameTeamIdTwo.teamName}} </td>
        <td> {{game.gameDate}}</td>
    </tr>
{% endfor %}

İşte varlık sınıfımdaki değişken:

/**
 * @var date $gameDate
 *
 * @ORM\Column(name="GAME_DATE", type="datetime", nullable=true)
 */
private $gameDate;

İşte aldığım hata mesajı:

Bir şablonun oluşturulması sırasında bir istisna oluştu ("Catchable Fatal Error: DateTime sınıfının nesnesi ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php line 33" ) satırındaki "BeerBundle: Oyunlar: gameTable.html.twig" bölümünde.

Yanıtlar:


305

Her ne kadar kullanabilirsiniz

{{ game.gameDate|date('Y-m-d') }}

yaklaşım olarak, bu sürümün yalnızca bir milliyetin kullanıcıları tarafından kullanılan bir siteyle ilgili bir sorun olmaması gereken kullanıcı yerel ayarını onurlandırmadığını unutmayın. Uluslararası kullanıcılar, oyun tarihini, \DateTimesınıfı genişletmek __toString()ve yerel ayarı kontrol eden ve buna göre hareket eden bir yöntem eklemek gibi tamamen farklı göstermelidir .

Düzenle :

Bir yorumda @Nic tarafından işaret edildiği gibi , Twig Intl uzantısını kullanırsanız localizeddate, kullanıcının yerel ayarında tarihi gösteren bir filtreniz olur. Bu şekilde önceki genişletme fikrimi bırakabilirsiniz \DateTime.


45
{{ game.gameDate|date('Y-m-d H:i:s') }}tarih ve saat için. Dakikalarca karakter bulmakta sorun yaşadım.
murko

6
Twig'in tarih işlevi php işleviyle aynı biçimi kullanır (Twig belgelerinden). Başka formatlar arayanlar için php.net/manual/en/function.date.php .
JonnyS

9
Boş değerlere dikkat edin; Benzer bir kullanım durumunda, Twig'in dateişlevine boş bir değer verirken bugünün tarihini görüyorum . {% if game.gameDate is not empty %} ... {%endif}
Örneğinize göre

4
Yerelleştirmeye gelince, DateTimesınıfı genişletmemelisiniz ! Bunun yerine, Twig için localizeddatefiltreyi kullanmanız yeterlidir .
Nic Wortel

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}önerilebilir
Dheeraj

90

dateFiltre kullanabilirsiniz :

{{ game.gameDate|date("m/d/Y") }}

3
Sana tamamen katılıyorum. Varsayılan olarak orada olması gereken bir şey.
tftd

2
@ThomasDecaux aslında hiç de garip değil, çünkü bir __toString()yöntemin DateTimenesneyi dönüştürmek için hangi formatı bilmesi gerekir ve muhtemelen orada yüzlerce olası format vardır. Tabii ki, PHP'de format()yöntemi DateTimebir format argümanı alan bir nesne üzerinde kullanabilirsiniz ve datefiltre sadece bu yöntemin Twig eşdeğeridir.
Nic Wortel

68

Tarihin gösterilmesini istediğiniz biçime bağlıdır.

Statik tarih biçimi

Tüm yerel ayarlar için aynı olan statik bir biçim görüntülemek istiyorsanız (örneğin , Atom yayını için ISO 8601 ), Twig'in datefiltresini kullanmalısınız :

{{ game.gameDate|date('Y-m-d\\TH:i:sP') }}

Hangisi her zaman bir tarih saatini aşağıdaki biçimde döndürür:

2014-05-02T08: 55: 41Z

dateFiltre tarafından kabul edilen biçim dizeleri PHP'nin date()işlevi için kullandığınız dizelerle aynıdır . (tek fark, bildiğim kadarıyla PHP date()işlevinde kullanılabilen önceden tanımlanmış sabitleri kullanamayacağınızdır )

Yerelleştirilmiş tarihler (ve saatler)

Bununla birlikte, tarayıcıda oluşturmak istediğiniz için, muhtemelen kullanıcının dili ve konumu için yerelleştirilmiş, insan tarafından okunabilir bir biçimde göstermek istersiniz. Yerelleştirmeyi kendiniz yapmak yerine, bunun için Intl Uzantısını kullanabilirsiniz (PHP'nin IntlDateFormatter'ı kullanır ). localizeddateYerelleştirilmiş bir format kullanarak tarih ve saati çıktılayacak bir filtre sağlar .

localizeddate( date_format, time_format [, locale ] )

Bağımsız değişkenler localizeddate:

  • date_format: Biçim dizelerinden biri (aşağıya bakın)
  • time_format: Biçim dizelerinden biri (aşağıya bakın)
  • locale: (isteğe bağlı) Yapılandırılmış yerel ayarı geçersiz kılmak için bunu kullanın. Symfony'nin yapılandırmasında yapılandırılabilen varsayılan yerel ayarı kullanmak için bu bağımsız değişkeni dışarıda bırakın.

(dahası da vardır, olası argümanların tam listesi için dokümanlara bakın )

İçin date_formatve time_formataşağıdaki dizelerden birini kullanabilirsiniz:

  • 'none' bu öğeyi eklemek istemiyorsanız
  • 'short' en kısaltılmış stil için (İngilizce yerel ayarlarda 12/13/52 veya 15:30)
  • 'medium' orta stil için (İngilizce yerel ayarda 12 Ocak 1952)
  • 'long' uzun stil için (İngilizce yerel ayarlarda 12 Ocak 1952 veya 15:30:32)
  • 'full' tamamen belirtilen stil için (İngilizce yerel ayarlarda 12 Nisan 1952 Salı veya 15:30:42 pm PST)

Misal

Örneğin, tarihi, eşdeğer bir biçimde görüntülemek istiyorsanız February 6, 2014 at 10:52 AM, Twig şablonunuzda aşağıdaki satırı kullanın:

{{ game.gameDate|localizeddate('long', 'short') }}

Ancak, farklı bir yerel ayar kullanırsanız, sonuç bu yerel ayar için yerelleştirilir:

  • 6 februari 2014 10:52için nlyerel ayar;
  • 6 février 2014 10:52için fryerel ayar;
  • 6. Februar 2014 10:52için deyerel ayar; vb.

Gördüğün gibi, localizeddate sadece ay adlarını çevirmekle kalmaz, aynı zamanda yerel gösterimleri de kullanır. İngilizce gösterimi aydan sonra, Hollandaca, Fransızca ve Almanca gösterimlerin aydan önce koyulduğu tarihi belirtir. İngilizce ve Almanca ay isimleri büyük harfle başlarken, Hollandaca ve Fransızca ay isimleri küçük harftir. Ve Alman tarihlerinde bir nokta var.

Yerel ayarı yükleme / ayarlama

Intl uzantısı için kurulum talimatları bu ayrı yanıtta bulunabilir .


1
Yerelleştirilmiş tarihler (ve saatler) - Bu @Nic - awesome için çok teşekkür ederim!
webDEVILopers

Merhaba, localizeddate kullanarak, sadece M ve Y (gün değil) çıktısını nasıl biliyorsunuz? thks
mario

3

Unutma

@ORM \ HasLifecycleCallbacks ()

Varlık:

/**
     * Set gameDate
     *
     * @ORM\PrePersist
     */
    public function setGameDate()
    {
        $this->dateCreated = new \DateTime();

        return $this;
    }

Görünüm:

{{ item.gameDate|date('Y-m-d H:i:s') }}

>> Çıktı 2013-09-18 16:14:20


2

Geçerli yerel ayarda tarihi görüntülemek için bir symfony2 aracı vardır:

{{ user.createdAt|localeDate }} to have a medium date and no time, in the current locale

{{ user.createdAt|localeDate('long','medium') }} to have a long date and medium time, in the current locale

https://github.com/michelsalib/BCCExtraToolsBundle


2
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

Saat dilimi uzaklığını içeren tam tarih saat dizesi için.



1

Bunun oldukça eski bir soru olduğunu biliyorum, ama bugün bu soruyu buldum, ama cevapları ihtiyacım olan şey değildi.

İşte ihtiyacım olan şey.

Eğer varsa benim gibi , görüntülemek isteyen geçerli dal tarih, aşağıdaki kullanabilirsiniz:

{{ "now"|date("m/d/Y") }}

Bununla ilgili belgelere bakın:

dalda tarih


0

Boş değerde hata oluşmasını önlemek için şu kodu kullanabilirsiniz:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.