Twig टेम्पलेट में DateTime ऑब्जेक्ट को कैसे रेंडर किया जाए


215

मेरी एक संस्था में मेरा एक क्षेत्र "डेटाइम" चर है।

ब्राउज़र में रेंडर करने के लिए मैं इस फ़ील्ड को स्ट्रिंग में कैसे बदल सकता हूँ?

यहाँ एक कोड स्निपेट है:

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

यहाँ मेरी इकाई वर्ग में चर है:

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

और यहाँ त्रुटि संदेश मुझे मिल रहा है:

एक टेम्प्लेट के प्रतिपादन के दौरान एक अपवाद को फेंक दिया गया है ("कैटलेबल फेटल एरर: क्लास डेटाइम के ऑब्जेक्ट को स्ट्रिंग में परिवर्तित नहीं किया जा सकता ... \ app \ cache \ devig \ 9b \ ad \ 58fd3bb1517332badf1fdc7fa4a8.php लाइन 33" ) "बीयरबंडल: गेम्स: गेमटेबल.html.twig" 10 पंक्ति में।

जवाबों:


305

यद्यपि आप उपयोग कर सकते हैं

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

दृष्टिकोण, ध्यान रखें कि यह संस्करण उपयोगकर्ता के लोकेल का सम्मान नहीं करता है, जिसे केवल एक राष्ट्रीयता के उपयोगकर्ताओं द्वारा उपयोग की जाने वाली साइट के साथ कोई समस्या नहीं होनी चाहिए। अंतर्राष्ट्रीय उपयोगकर्ताओं को गेम की तारीख को पूरी तरह से अलग दिखाना चाहिए, जैसे कि विस्तार करना\DateTime कक्षा का , और इसमें एक __toString()विधि जोड़ना जो लोकेल की जांच करता है और तदनुसार कार्य करता है।

संपादित करें :

जैसा कि @Nic ने एक टिप्पणी में बताया है, यदि आप ट्विग के Intl एक्सटेंशन का उपयोग करते हैं, तो आपके पास एक localizeddateफ़िल्टर उपलब्ध होगा, जो उपयोगकर्ता के स्थान में दिनांक दिखाता है। इस तरह से आप मेरे पिछले विचार को विस्तार दे सकते हैं \DateTime


45
{{ game.gameDate|date('Y-m-d H:i:s') }}दिनांक और समय के लिए। मुझे मिनटों के लिए चरित्र खोजने में समस्या थी।
मर्को

6
Twig की तिथि फ़ंक्शन php फ़ंक्शन (Twig डॉक्स से) के समान प्रारूप का उपयोग करती है। अन्य स्वरूपों की तलाश में किसी के लिए, php.net/manual/en/function.date.php
जॉनीस

9
अशक्त मूल्यों के लिए बाहर देखो; इसी तरह के उपयोग के मामले में, मैं आज की तारीख को देख रहा हूं जब ट्विग के dateकार्य को एक शून्य मान दिया गया है । अपने उदाहरण के आधार पर, आप में लपेट करने की आवश्यकता होगी{% if game.gameDate is not empty %} ... {%endif}
fazy

4
स्थानीयकरण के लिए, आपको DateTimeकक्षा का विस्तार नहीं करना चाहिए ! इसके बजाय, बस localizeddateटहनी के लिए फिल्टर का उपयोग करें
निक वोर्टेल

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}सुझाव दिया जाएगा
धीरज

90

आप dateफ़िल्टर का उपयोग कर सकते हैं :

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

3
आपसे पूर्णतः सहमत हूँ। यह कुछ ऐसा है जो डिफ़ॉल्ट रूप से होना चाहिए।
tftd

2
@ThomasDecaux वास्तव में इतना अजीब नहीं है, क्योंकि एक __toString()विधि को यह जानना होगा कि DateTimeऑब्जेक्ट को किस प्रारूप में बदलना है, और संभवत: सैकड़ों संभावित प्रारूप हैं। बेशक, PHP में आप format()किसी DateTimeऑब्जेक्ट पर विधि का उपयोग कर सकते हैं , जो एक प्रारूप तर्क लेता है, और dateफ़िल्टर बस उस विधि के बराबर टहनी है।
निक वॉर्टेल

68

यह उस प्रारूप पर निर्भर करता है जिसे आप चाहते हैं कि तारीख को दिखाया जाए।

स्थैतिक तिथि प्रारूप

यदि आप एक स्थिर प्रारूप प्रदर्शित करना चाहते हैं, जो सभी स्थानों के लिए समान है (उदाहरण के लिए एटम फ़ीड के लिए आईएसओ 8601 ), तो आपको ट्विग के dateफिल्टर का उपयोग करना चाहिए :

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

निम्नलिखित प्रारूप में कौन से रास्ते से डेटाटाइम वापस आएगा:

2014-05-02T08: 55: 41Z

dateफ़िल्टर द्वारा स्वीकार किए गए प्रारूप स्ट्रिंग वही हैं जो आप PHP के date()फ़ंक्शन के लिए उपयोग करेंगे । (अंतर केवल इतना है कि, जहां तक ​​मुझे पता है, आप उन पूर्वनिर्धारित स्थिरांक का उपयोग नहीं कर सकते हैं जो PHP में उपयोग किए जा सकते हैंdate() फ़ंक्शन )

स्थानीयकृत तिथियां (और समय)

हालाँकि, चूंकि आप इसे ब्राउज़र में रेंडर करना चाहते हैं, आप संभवतः इसे मानव-पठनीय प्रारूप में दिखाना चाहेंगे, जो उपयोगकर्ता की भाषा और स्थान के लिए स्थानीय हो। अपने आप को स्थानीयकरण करने के बजाय, आप इसके लिए Intl एक्सटेंशन का उपयोग कर सकते हैं (जो PHP के IntlDateFormatter का उपयोग करता है )। यह एक फिल्टर प्रदान करता है localizeddateजो स्थानीयकृत प्रारूप का उपयोग करके दिनांक और समय का उत्पादन करेगा।

localizeddate( date_format, time_format [, locale ] )

इसके लिए तर्क localizeddate:

  • date_format: प्रारूप स्ट्रिंग में से एक (नीचे देखें)
  • time_format: प्रारूप स्ट्रिंग में से एक (नीचे देखें)
  • locale: (वैकल्पिक) कॉन्फ़िगर लोकेल को ओवरराइड करने के लिए इसका उपयोग करें। इस तर्क को डिफ़ॉल्ट लोकेल का उपयोग करने के लिए छोड़ दें, जिसे सिम्फनी के कॉन्फ़िगरेशन में कॉन्फ़िगर किया जा सकता है।

(और भी हैं , डॉक्स देखें संभावित तर्कों की पूरी सूची के लिए )

के लिए date_formatऔर time_formatआप निम्नलिखित तार में से एक का उपयोग कर सकते हैं:

  • 'none' यदि आप इस तत्व को शामिल नहीं करना चाहते हैं
  • 'short' सबसे संक्षिप्त शैली के लिए (१२/१३/५२ या ३:३० बजे एक अंग्रेजी स्थान पर)
  • 'medium' मध्यम शैली के लिए (जनवरी 12, 1952 में एक अंग्रेजी लोकेल में)
  • 'long' लंबी शैली के लिए (12 जनवरी, 1952 या 3:30:32 बजे एक अंग्रेजी लोकेल में)
  • 'full' पूरी तरह से निर्दिष्ट शैली के लिए (मंगलवार, 12 अप्रैल, 1952 ई। या 3:30:42 एक अंग्रेजी स्थान पर पीएसटी)

उदाहरण

उदाहरण के लिए, यदि आप किसी प्रारूप में दिनांक को उसके समकक्ष प्रदर्शित करना चाहते हैं, तो February 6, 2014 at 10:52 AMअपने Twig टेम्पलेट में निम्न पंक्ति का उपयोग करें:

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

हालाँकि, यदि आप एक अलग स्थान का उपयोग करते हैं, तो परिणाम उस स्थान के लिए स्थानीय हो जाएगा:

  • 6 februari 2014 10:52के लिए nlस्थान;
  • 6 février 2014 10:52के लिए frस्थान;
  • 6. Februar 2014 10:52के लिए deस्थान; आदि।

जैसा कि आप देख सकते हैं, localizeddate न केवल महीने के नामों का अनुवाद करता है बल्कि स्थानीय नोटेशन का भी उपयोग करता है। अंग्रेजी अंकन महीने के बाद की तारीख डालता है, जहां डच, फ्रेंच और जर्मन अंकन महीने के पहले डालते हैं। अंग्रेजी और जर्मन महीने के नाम एक बड़े अक्षर से शुरू होते हैं, जबकि डच और फ्रेंच महीने के नाम लोअरकेस हैं। और जर्मन की तारीखों में एक डॉट जोड़ा गया है।

स्‍थापना स्‍थापित / स्‍थापित करना

Intl एक्सटेंशन के इंस्टॉलेशन निर्देश इस अलग जवाब में पाए जा सकते हैं ।


1
स्थानीयकृत दिनांक (और समय) - इस @ के लिए बहुत बहुत धन्यवाद - भयानक!
webDEVILopers

नमस्ते, स्थानीयकृत का उपयोग करते हुए, क्या आप जानते हैं कि सिर्फ एम और वाई (दिन नहीं) कैसे आउटपुट करें? thks
मारियो

3

मत भूलना

@ORM \ HasLifecycleCallbacks ()

इकाई:

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

        return $this;
    }

राय:

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

>> आउटपुट 2013-09-18 16:14:20


2

वर्तमान लोकेल में दिनांक प्रदर्शित करने के लिए एक सिम्फनी 2 उपकरण है:

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

फुल डेट टाइम स्ट्रिंग के लिए टाइमजोन ऑफसेट सहित।



1

मुझे पता है कि यह एक बहुत पुराना सवाल है, लेकिन मुझे आज यह सवाल मिला, लेकिन जवाब मुझे नहीं चाहिए थे।

तो यहाँ मुझे क्या चाहिए।

यदि आप, मेरी तरह , टहनी में वर्तमान तिथि प्रदर्शित करना चाहते हैं, तो आप निम्नलिखित का उपयोग कर सकते हैं:

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

इसके बारे में प्रलेखन देखें:

टहनी में तारीख


0

शून्य मान पर त्रुटि से बचने के लिए आप इस कोड का उपयोग कर सकते हैं:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.