วิธีการแสดงวัตถุ DateTime ในแม่แบบ Twig


215

หนึ่งในฟิลด์ของฉันในหนึ่งในเอนทิตีของฉันคือตัวแปร "datetime"

ฉันจะแปลงฟิลด์นี้เป็นสตริงเพื่อแสดงในเบราว์เซอร์ได้อย่างไร

นี่คือข้อมูลโค้ด:

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

และนี่คือข้อความแสดงข้อผิดพลาดที่ฉันได้รับ:

มีข้อผิดพลาดเกิดขึ้นระหว่างการแสดงผลเทมเพลต ("ข้อผิดพลาดร้ายแรงที่ตรวจจับได้: วัตถุของคลาส DateTime ไม่สามารถแปลงเป็นสตริงใน ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php บรรทัด 33" ) ใน "BeerBundle: Games: gameTable.html.twig" ที่บรรทัด 10

คำตอบ:


305

แม้ว่าคุณจะสามารถใช้

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

โปรดทราบว่ารุ่นนี้ไม่ให้ความสำคัญกับภาษาของผู้ใช้ซึ่งไม่น่าจะมีปัญหากับเว็บไซต์ที่ใช้โดยผู้ใช้ที่มีสัญชาติเดียวเท่านั้น ผู้ใช้ต่างประเทศควรแสดงวันที่ของเกมที่แตกต่างกันโดยสิ้นเชิงเช่นการขยาย\DateTimeชั้นเรียนและเพิ่ม__toString()วิธีการที่จะตรวจสอบสถานที่และดำเนินการตาม

แก้ไข :

ตามที่ระบุโดย @Nic ในความคิดเห็นหากคุณใช้ส่วนขยาย Intl ของ Twigคุณจะมีlocalizeddateตัวกรองที่พร้อมใช้งานซึ่งแสดงวันที่ในภาษาของผู้ใช้ \DateTimeวิธีนี้คุณสามารถวางความคิดของฉันก่อนหน้าของการขยาย


45
{{ game.gameDate|date('Y-m-d H:i:s') }}สำหรับวันที่และเวลา ฉันมีปัญหาในการค้นหาตัวละครเป็นเวลาหลายนาที
murko

6
ฟังก์ชัน date ของ Twig ใช้รูปแบบเดียวกับฟังก์ชัน php (จาก Twig docs) สำหรับใครที่กำลังมองหารูปแบบอื่น ๆphp.net/manual/en/function.date.php
JonnyS

9
ระวังค่า null; ในกรณีที่คล้ายกันฉันเห็นวันที่วันนี้เมื่อทำการ pip ค่า Null กับdateฟังก์ชั่นของ Twig จากตัวอย่างของคุณคุณจะต้องห่อหุ้มด้วย{% if game.gameDate is not empty %} ... {%endif}
fazy

4
สำหรับการแปลคุณไม่ควรขยายDateTimeชั้นเรียน! ให้ใช้localizeddateตัวกรองสำหรับ Twigแทน
Nic Wortel

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}จะแนะนำ
Dheeraj

90

คุณสามารถใช้dateตัวกรอง:

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

3
เห็นด้วยกับคุณโดยสิ้นเชิง เป็นสิ่งที่ควรมีโดยค่าเริ่มต้น
tftd

2
@ThomasDecaux ที่จริงไม่แปลกเลยเพราะ__toString()วิธีการจะต้องรู้ว่ารูปแบบการแปลงDateTimeวัตถุเป็นและอาจมีหลายร้อยรูปแบบที่เป็นไปได้มี แน่นอนใน PHP คุณสามารถใช้format()วิธีการกับDateTimeวัตถุซึ่งใช้รูปแบบการโต้แย้งและdateตัวกรองเป็นเพียงทวิกเทียบเท่ากับวิธีการนั้น
Nic Wortel

68

ขึ้นอยู่กับรูปแบบที่คุณต้องการให้แสดงวันที่

รูปแบบวันที่คงที่

หากคุณต้องการที่จะแสดงรูปแบบคงที่ซึ่งเป็นเหมือนกันสำหรับตำแหน่งที่ตั้งทั้งหมด (เช่นISO 8601สำหรับฟีด Atom) คุณควรใช้ทวิของdateตัวกรอง :

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

ซึ่งจะส่งคืนค่าตลอดเวลาในรูปแบบต่อไปนี้

2014-05-02T08: 55: 41Z

สตริงรูปแบบที่ยอมรับโดยdateตัวกรองเป็นเช่นเดียวกับที่คุณจะใช้สำหรับPHP ของdate()ฟังก์ชั่น (ความแตกต่างเพียงอย่างเดียวคือเท่าที่ฉันรู้คุณไม่สามารถใช้ค่าคงที่กำหนดไว้ล่วงหน้าซึ่งสามารถใช้ในdate()ฟังก์ชั่นPHP )

วันที่แปล (และครั้ง)

อย่างไรก็ตามเนื่องจากคุณต้องการแสดงในเบราว์เซอร์คุณอาจต้องการแสดงในรูปแบบที่มนุษย์สามารถอ่านได้ซึ่งแปลเป็นภาษาและตำแหน่งที่ตั้งของผู้ใช้ แทนที่จะใช้การแปลเป็นภาษาท้องถิ่นด้วยตัวคุณเองคุณสามารถใช้ส่วนขยายของ Intlสำหรับสิ่งนี้ (ซึ่งใช้ประโยชน์จากIntlDateFormatterของ PHP ) มันมีตัวกรองlocalizeddateซึ่งจะส่งออกวันที่และเวลาโดยใช้รูปแบบที่มีการแปล

localizeddate( date_format, time_format [, locale ] )

อาร์กิวเมนต์สำหรับlocalizeddate:

  • date_format: หนึ่งในสตริงรูปแบบ (ดูด้านล่าง)
  • time_format: หนึ่งในสตริงรูปแบบ (ดูด้านล่าง)
  • locale: (เป็นทางเลือก) ใช้สิ่งนี้เพื่อแทนที่โลแคลที่กำหนดค่าไว้ ปล่อยให้อาร์กิวเมนต์นี้ออกเพื่อใช้ภาษาเริ่มต้นซึ่งสามารถกำหนดค่าในการกำหนดค่าของ Symfony

(มีมากขึ้นดูเอกสารสำหรับรายการทั้งหมดของข้อโต้แย้งที่เป็นไปได้)

สำหรับdate_formatและtime_formatคุณสามารถใช้หนึ่งในสตริงต่อไปนี้:

  • 'none' หากคุณไม่ต้องการรวมองค์ประกอบนี้
  • 'short' สำหรับสไตล์ที่สั้นที่สุด (12/13/52 หรือ 15.00 น. ในภาษาอังกฤษ)
  • 'medium' สำหรับสไตล์กลาง (12 ม.ค. 1952 เป็นภาษาอังกฤษ)
  • 'long' สำหรับแบบยาว (12 มกราคม 2495 หรือ 3:30:32 น. ในภาษาอังกฤษ)
  • 'full' สำหรับสไตล์ที่ระบุไว้อย่างสมบูรณ์ (อังคาร 12 เมษายน, 1952 AD หรือ 3:30:42 น. PST ในภาษาอังกฤษ)

ตัวอย่าง

ตัวอย่างเช่นหากคุณต้องการแสดงวันที่ในรูปแบบที่เทียบเท่าให้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
วันที่แปล (และเวลา) - ขอบคุณมากสำหรับ @Nic นี้ - ยอดเยี่ยม!
webDEVILopers

สวัสดีคุณใช้ localizeddate คุณรู้วิธีการส่งออกเพียงแค่ M และ Y (ไม่ใช่วัน)? thks
mario

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
{{game.gameDate | date('c')}}  // 2014-02-05T16:45:22+00:00

สำหรับสตริงเวลาวันที่แบบเต็มรวมถึงการชดเชยเขตเวลา



1

ฉันรู้ว่านี่เป็นคำถามที่ค่อนข้างเก่า แต่ฉันพบคำถามนี้ในวันนี้ แต่คำตอบไม่ใช่สิ่งที่ฉันต้องการ

ดังนั้นนี่คือสิ่งที่ฉันต้องการ

หากคุณชอบฉันกำลังต้องการแสดงวันที่ปัจจุบันเป็นทวิคุณสามารถใช้สิ่งต่อไปนี้:

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

ดูเอกสารเกี่ยวกับสิ่งนี้:

วันที่ในกิ่งไม้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.