Cách hiển thị đối tượng DateTime trong mẫu Twig


215

Một trong các trường của tôi trong một trong các thực thể của tôi là biến "datetime".

Làm cách nào tôi có thể chuyển đổi trường này thành một chuỗi để kết xuất trong trình duyệt?

Đây là một đoạn mã:

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

Đây là biến trong lớp thực thể của tôi:

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

Và đây là thông báo lỗi tôi nhận được:

Một ngoại lệ đã được đưa ra trong quá trình kết xuất mẫu ("Lỗi nghiêm trọng có thể bắt được: Đối tượng của lớp DateTime không thể được chuyển đổi thành chuỗi trong ... \ app \ cache \ dev \ twig \ 9b \ ad \ 58fd3bb1517632badf1fdc7fa4a8.php dòng 33" ) trong "BeerBundle: Games: gameTable.html.twig" ở dòng 10.

Câu trả lời:


305

Mặc dù bạn có thể sử dụng

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

Tiếp cận, hãy nhớ rằng phiên bản này không tôn trọng ngôn ngữ người dùng, điều này không phải là vấn đề với một trang web chỉ được sử dụng bởi một người dùng của một quốc tịch. Người dùng quốc tế nên hiển thị ngày trò chơi hoàn toàn khác nhau, như mở rộng \DateTimelớp và thêm một __toString()phương thức để kiểm tra ngôn ngữ và hành động tương ứng.

Chỉnh sửa :

Như @Nic đã chỉ ra trong một nhận xét, nếu bạn sử dụng tiện ích mở rộng Intl của Twig , bạn sẽ có localizeddatesẵn một bộ lọc, hiển thị ngày trong ngôn ngữ của người dùng. Bằng cách này bạn có thể bỏ ý tưởng mở rộng trước đây của tôi \DateTime.


45
{{ game.gameDate|date('Y-m-d H:i:s') }}cho ngày và thời gian. Tôi gặp vấn đề trong việc tìm kiếm nhân vật trong vài phút.
murko

6
Hàm ngày của Twig sử dụng định dạng giống như hàm php (từ các tài liệu Twig). Đối với bất kỳ ai đang tìm kiếm các định dạng khác, php.net/manual/en/feft.date.php .
JonnyS

9
Coi chừng giá trị null; trong trường hợp sử dụng tương tự, tôi thấy ngày hôm nay khi chuyển một giá trị null sang datechức năng của Twig . Dựa trên ví dụ của bạn, bạn sẽ cần phải bọc lại{% if game.gameDate is not empty %} ... {%endif}
fazy

4
Đối với nội địa hóa, bạn không nên mở rộng DateTimelớp học! Thay vào đó, chỉ cần sử dụng localizeddatebộ lọc cho Twig .
Nic Wortel

1
{% if game.gameDate %} {{ game.gameDate|date('Y-m-d H:i:s') }} {% endif %}sẽ được đề xuất
Dheeraj

90

Bạn có thể sử dụng datebộ lọc:

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

3
Hoàn toàn đồng ý với bạn. Đó là một cái gì đó nên có ở đó theo mặc định.
tftd

2
@ThomasDecaux thực sự không quá xa lạ, bởi vì một __toString()phương thức sẽ cần biết định dạng nào để chuyển đổi DateTimeđối tượng và có thể có hàng trăm định dạng có thể có. Tất nhiên, trong PHP bạn có thể sử dụng format()phương thức trên một DateTimeđối tượng, trong đó có một đối số định dạng và datebộ lọc chỉ đơn giản là tương đương Twig của phương thức đó.
Nic Wortel

68

Nó phụ thuộc vào định dạng bạn muốn ngày được hiển thị là.

Định dạng ngày tĩnh

Nếu bạn muốn hiển thị định dạng tĩnh, giống với tất cả các địa điểm (ví dụ ISO 8601 cho nguồn cấp dữ liệu Atom), bạn nên sử dụng datebộ lọc của Twig :

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

Luôn luôn trả về một datetime theo định dạng sau:

2014-05 / 02T08: 55: 41Z

Các chuỗi định dạng được datebộ lọc chấp nhận giống như bạn sử dụng cho hàm của PHPdate() . (sự khác biệt duy nhất là, theo như tôi biết, bạn không thể sử dụng các hằng số được xác định trước có thể được sử dụng trong date()hàm PHP )

Ngày địa phương (và thời gian)

Tuy nhiên, vì bạn muốn hiển thị nó trong trình duyệt, nên bạn có thể muốn hiển thị nó ở định dạng có thể đọc được, được bản địa hóa cho ngôn ngữ và vị trí của người dùng. Thay vì tự mình bản địa hóa, bạn có thể sử dụng Tiện ích mở rộng Intl cho việc này (sử dụng IntlDateFormatter của PHP ). Nó cung cấp một bộ lọc localizeddatesẽ xuất ngày và giờ bằng định dạng cục bộ.

localizeddate( date_format, time_format [, locale ] )

Đối số cho localizeddate:

  • date_format: Một trong các chuỗi định dạng (xem bên dưới)
  • time_format: Một trong các chuỗi định dạng (xem bên dưới)
  • locale: (tùy chọn) Sử dụng phần này để ghi đè ngôn ngữ được định cấu hình. Để lại đối số này để sử dụng ngôn ngữ mặc định, có thể được cấu hình trong cấu hình của Symfony.

(có nhiều hơn, xem các tài liệu cho danh sách đầy đủ các đối số có thể)

Cho date_formattime_formatbạn có thể sử dụng một trong các chuỗi sau:

  • 'none' nếu bạn không muốn bao gồm yếu tố này
  • 'short' cho kiểu viết tắt nhất (12/13/52 hoặc 3:30 chiều tại một địa điểm tiếng Anh)
  • 'medium' cho phong cách trung bình (ngày 12 tháng 1 năm 1952 tại một địa phương tiếng Anh)
  • 'long' cho kiểu dài (ngày 12 tháng 1 năm 1952 hoặc 3:30:32 chiều tại một địa phương tiếng Anh)
  • 'full' cho kiểu hoàn toàn được chỉ định (Thứ ba, ngày 12 tháng 4 năm 1952 sau Công nguyên hoặc 3:30:42 chiều PST theo ngôn ngữ tiếng Anh)

Thí dụ

Vì vậy, ví dụ, nếu bạn muốn hiển thị ngày ở định dạng tương đương February 6, 2014 at 10:52 AM, hãy sử dụng dòng sau trong mẫu Twig của bạn:

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

Tuy nhiên, nếu bạn sử dụng một ngôn ngữ khác, kết quả sẽ được bản địa hóa cho miền địa phương đó:

  • 6 februari 2014 10:52cho nlmiền địa phương;
  • 6 février 2014 10:52cho frmiền địa phương;
  • 6. Februar 2014 10:52cho demiền địa phương; Vân vân.

Như bạn có thể thấy, localizeddatekhông chỉ dịch tên tháng mà còn sử dụng các ký hiệu địa phương. Ký hiệu tiếng Anh đặt ngày sau tháng, trong đó các ký hiệu tiếng Hà Lan, tiếng Pháp và tiếng Đức đặt ngày trước tháng. Tên tháng tiếng Anh và tiếng Đức bắt đầu bằng một chữ cái viết hoa, trong khi tên tháng tiếng Hà Lan và tiếng Pháp là chữ thường. Và ngày Đức có một dấu chấm được nối thêm.

Cài đặt / cài đặt ngôn ngữ

Hướng dẫn cài đặt cho phần mở rộng Intl có thể được tìm thấy trong câu trả lời riêng biệt này .


1
Ngày địa phương (và thời gian) - cảm ơn bạn rất nhiều vì điều này @Nic - tuyệt vời!
webDEVILopers

Xin chào, sử dụng localizeddate, bạn có biết cách xuất chỉ M và Y (không phải ngày) không? thks
mario

3

Đừng quên

@ORM \ HasLifecyclCallbacks ()

Thực thể:

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

        return $this;
    }

Lượt xem:

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

>> Sản lượng 2013-09-18 16:14:20


2

Có một công cụ symfony2 để hiển thị ngày ở miền địa phương hiện tại:

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

Đối với chuỗi thời gian ngày đầy đủ bao gồm cả múi giờ bù.



1

Tôi biết đây là một câu hỏi khá cũ, nhưng tôi đã tìm thấy câu hỏi này ngày hôm nay, nhưng câu trả lời không phải là điều tôi cần.

Vì vậy, đây là những gì tôi cần.

Nếu bạn, giống như tôi , đang tìm cách hiển thị ngày hiện tại theo twig, bạn có thể sử dụng như sau:

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

Xem tài liệu về điều này:

ngày tháng năm


0

Để tránh lỗi về giá trị null, bạn có thể sử dụng mã này:

{{ game.gameDate ? game.gameDate|date('Y-m-d H:i:s') : '' }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.