Cara merender objek DateTime dalam templat Ranting

215

Salah satu bidang saya di salah satu entitas saya adalah variabel "datetime".

Bagaimana saya bisa mengubah bidang ini menjadi string untuk di-render di browser?

Berikut ini cuplikan kode:

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

Berikut adalah variabel dalam kelas entitas saya:

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

Dan inilah pesan kesalahan yang saya dapat:

Pengecualian telah dilemparkan selama rendering templat ("Kesalahan Fatal yang Dapat Ditangkap: Objek kelas DateTime tidak dapat dikonversi ke string di ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php baris 33" ) di "BeerBundle: Games: gameTable.html.twig" di baris 10.

Chris Ridmann
sumber

Jawaban:

305

Meskipun Anda dapat menggunakan

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

pendekatan, perlu diingat bahwa versi ini tidak menghormati lokal pengguna, yang seharusnya tidak menjadi masalah dengan situs yang hanya digunakan oleh pengguna dari satu negara. Pengguna internasional harus menampilkan tanggal permainan yang sama sekali berbeda, seperti memperluas \DateTimekelas, dan menambahkan __toString()metode untuk itu yang memeriksa lokal dan bertindak sesuai.

Edit :

Seperti yang ditunjukkan oleh @Nic dalam komentar, jika Anda menggunakan ekstensi Intl Twig , Anda akan memiliki localizeddatefilter yang tersedia, yang menunjukkan tanggal di lokal pengguna. Dengan cara ini Anda dapat membatalkan ide saya sebelumnya untuk memperpanjang \DateTime.

GergelyPolonkai
sumber
45
{{ game.gameDate|date('Y-m-d H:i:s') }}untuk tanggal dan waktu. Saya kesulitan menemukan karakter selama beberapa menit.
murko
6
Fungsi tanggal Twig menggunakan format yang sama dengan fungsi php (dari dokumen Twig). Bagi siapa pun yang mencari format lain, php.net/manual/en/function.date.php .
JonnyS
9
Perhatikan nilai nol; dalam kasus penggunaan yang sama, saya melihat tanggal hari ini ketika memipakan nilai nol ke datefungsi Twig . Berdasarkan contoh Anda, Anda harus membungkusnya{% if game.gameDate is not empty %} ... {%endif}
fazy
4
Sedangkan untuk pelokalan, Anda tidak harus memperluas DateTimekelas! Sebagai gantinya, cukup gunakan localizeddatefilter untuk Twig .
Nic Wortel
1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}akan disarankan
Dheeraj
90

Anda dapat menggunakan datefilter:

{{ game.gameDate|date("m/d/Y") }}
Ondrej Slinták
sumber
3
Sepenuhnya setuju dengan Anda. Ini adalah sesuatu yang seharusnya ada di sana secara default.
tftd
2
@ThomasDecaux itu sebenarnya tidak begitu aneh sama sekali, karena suatu __toString()metode perlu mengetahui format untuk mengkonversi DateTimeobjek, dan mungkin ada ratusan kemungkinan format di luar sana. Tentu saja, di PHP Anda dapat menggunakan format()metode pada DateTimeobjek, yang mengambil argumen format, dan datefilter hanyalah ranting yang setara dengan metode itu.
Nic Wortel
68

Tergantung pada format yang Anda inginkan tanggalnya ditampilkan.

Format tanggal statis

Jika Anda ingin menampilkan format statis, yang sama untuk semua lokal (misalnya ISO 8601 untuk umpan Atom), Anda harus menggunakan datefilter Twig :

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

Yang akan selalu mengembalikan datetime dalam format berikut:

2014-05-02T08: 55: 41Z

String format yang diterima oleh datefilter adalah sama dengan yang Anda gunakan untuk fungsi PHPdate() . (satu-satunya perbedaan adalah bahwa, sejauh yang saya tahu, Anda tidak dapat menggunakan konstanta yang telah ditentukan yang dapat digunakan dalam date()fungsi PHP )

Tanggal yang dilokalkan (dan waktu)

Namun, karena Anda ingin merendernya di browser, Anda mungkin ingin menampilkannya dalam format yang dapat dibaca manusia, dilokalkan untuk bahasa dan lokasi pengguna. Alih-alih melakukan pelokalan sendiri, Anda dapat menggunakan Ekstensi Internasional untuk ini (yang menggunakan PHP's IntlDateFormatter ). Ini menyediakan filter localizeddateyang akan menampilkan tanggal dan waktu menggunakan format lokal.

localizeddate( date_format, time_format [, locale ] )

Argumen untuk localizeddate:

  • date_format: Salah satu format string (lihat di bawah)
  • time_format: Salah satu format string (lihat di bawah)
  • locale: (opsional) Gunakan ini untuk mengganti lokal yang dikonfigurasi. Biarkan argumen ini untuk menggunakan lokal default, yang dapat dikonfigurasi dalam konfigurasi Symfony.

(ada lebih banyak, lihat dokumen untuk daftar lengkap dari argumen yang mungkin)

Untuk date_formatdan time_formatAnda dapat menggunakan salah satu dari string berikut:

  • 'none' jika Anda tidak ingin memasukkan elemen ini
  • 'short' untuk gaya yang paling singkat (12/13/52 atau 3:30 sore di bahasa Inggris)
  • 'medium' untuk gaya sedang (12 Januari 1952 di tempat berbahasa Inggris)
  • 'long' untuk gaya panjang (12 Januari 1952 atau 15:30:32 dalam bahasa Inggris)
  • 'full' untuk gaya yang ditentukan sepenuhnya (Selasa, 12 April 1952 AD atau 3:30:42 pm PST dalam bahasa Inggris)

Contoh

Jadi, misalnya, jika Anda ingin menampilkan tanggal dalam format yang setara dengan February 6, 2014 at 10:52 AM, gunakan baris berikut di templat Twig Anda:

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

Namun, jika Anda menggunakan lokal yang berbeda, hasilnya akan dilokalisasi untuk lokal itu:

  • 6 februari 2014 10:52untuk nllokal;
  • 6 février 2014 10:52untuk frlokal;
  • 6. Februar 2014 10:52untuk delokal; dll.

Seperti yang Anda lihat, localizeddatetidak hanya menerjemahkan nama bulan tetapi juga menggunakan notasi lokal. Notasi bahasa Inggris menempatkan tanggal setelah bulan, di mana notasi Belanda, Perancis dan Jerman meletakkannya sebelum bulan. Nama bulan Inggris dan Jerman dimulai dengan huruf besar, sedangkan nama bulan Belanda dan Prancis adalah huruf kecil. Dan kurma Jerman memiliki titik ditambahkan.

Instalasi / pengaturan lokal

Petunjuk instalasi untuk ekstensi Intl dapat ditemukan di jawaban terpisah ini .

Nic Wortel
sumber
1
Tanggal yang dilokalkan (dan waktu) - terima kasih banyak atas @Nic ini - luar biasa!
webDEVILopers
Hai, dengan menggunakan localizeddate, apakah Anda tahu cara menghasilkan hanya M dan Y (bukan hari)? thks
mario
3

Jangan lupa

@ORM \ HasLifecycleCallbacks ()

Kesatuan :

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

        return $this;
    }

Melihat:

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

>> Output 2013-09-18 16:14:20

Ivan
sumber
2

Ada alat symfony2 untuk menampilkan tanggal di lokal saat ini:

{{ 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

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

Untuk string waktu tanggal penuh termasuk offset zona waktu.

Venkat Kotra
sumber
1

Saya tahu ini adalah pertanyaan yang cukup lama, tetapi saya menemukan pertanyaan ini hari ini, tetapi jawabannya bukan yang saya butuhkan.

Jadi, inilah yang saya butuhkan.

Jika Anda, seperti saya , ingin menampilkan tanggal saat ini dalam ranting, Anda dapat menggunakan yang berikut:

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

Lihat dokumentasi tentang ini:

tanggal dalam ranting

Refilon
sumber
0

Untuk menghindari kesalahan pada nilai nol, Anda dapat menggunakan kode ini:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Arnold Richmon
sumber