thay đổi định dạng ngày trong trang xem laravel


94

Tôi muốn thay đổi định dạng ngày được tìm nạp từ cơ sở dữ liệu. bây giờ tôi đã nhận 2016-10-01. {{$user->from_date}}Tôi muốn thay đổi định dạng 'dmy' trong laravel 5.3

{{ $user->from_date->format('d/m/Y')}}

Câu trả lời:


145

Thử đi:

date('d-m-Y', strtotime($user->from_date));

Nó sẽ chuyển đổi ngày tháng thành d-m-Yhoặc bất kỳ định dạng nào bạn đã đưa ra.

Lưu ý: Giải pháp này là giải pháp chung hoạt động cho php và bất kỳ khuôn khổ nào của nó. Đối với một phương pháp cụ thể của Laravel, hãy thử giải pháp được cung cấp bởi Hamelraj .


2
@ user3386779: Nó hoạt động nhưng không phải là giải pháp đẹp nhất :) Laravel có ít cơ chế để làm những việc này. Nếu bạn chọn câu trả lời của tôi, bạn cần đặt định dạng ngày ở một nơi và không cần nhớ thay đổi định dạng ngày mỗi khi bạn cần from_datecột hiển thị .
Marek Skiba

@MarekSkiba Tôi đã đề cập đến điều tương tự trong câu trả lời của mình :)
Mayank Pandeyz

những gì về để thay đổi ngôn ngữ ví dụ -> 'es' cho tên tháng
Alberto Acuña

1
Đồng ý với @sadiq bạn nên sử dụng $ user-> from_date-> định dạng ( 'd / m / Y')
Erik Larsson

1
Giải pháp tuyệt vời và rất đơn giản.
Muddasir23

129

Trong Laravel sử dụng Carbon tốt của nó

{{ \Carbon\Carbon::parse($user->from_date)->format('d/m/Y')}}

vâng, và điều gì xảy ra khi $ user-> from_date null?
lewis4u

1
@ lewis4u nếu bạn chuyển giá trị null vào parse(null)nó sẽ chuyển đổi thành ngày giờ hiện tại
Hamelraj

1
Đúng ... và điều đó không tốt cho một số trường hợp! Vì vậy hãy quan sát!
lewis4u

73

Trong bộ Mô hình của bạn:

protected $dates = ['name_field'];

sau khi bạn xem:

{{ $user->from_date->format('d/m/Y') }}

làm


3
Tôi nghĩ rằng đây là "cách laravel" nhất để làm điều này vì vậy điều này nên được đánh dấu là câu trả lời đúng.
CodeChuck

tôi cũng đồng ý, đây là cách tốt nhất
JonaPkr

Nó không làm việc cho tôi. Tôi đã sửa chữa loại cột ngày giờ và loại cột dấu thời gian, nhưng lỗi vẫn xảy raCall to a member function format() on null
Bariq Dharmawan

36

Bạn có thể kiểm tra Date Mutators: https://laravel.com/docs/5.3/eloquent-mutators#date-mutators

Bạn cần đặt Usercột mô hình của mình from_datetrong $datesmảng và sau đó bạn có thể thay đổi định dạng trong$dateFormat

Một tùy chọn khác cũng được đặt phương pháp này vào Usermô hình của bạn :

public function getFromDateAttribute($value) {
    return \Carbon\Carbon::parse($value)->format('d-m-Y');
}

và sau đó nếu bạn chạy, {{ $user->from_date }}bạn sẽ thấy định dạng mà bạn muốn.


đồng ý rằng đây là cách tốt hơn cho laravel
limco 14/09/17

1
Điểm bất lợi duy nhất là nó sẽ trả về một chuỗi cho khung nhìn; vì vậy nếu bạn muốn hiển thị các định dạng ngày khác nhau trong cùng một chế độ xem thì bạn sẽ phải định lại ngày bằng Carbon.
JustCarty

Xin lỗi về điều này, đây có phải là một Mutator vì nó sử dụng getFromDateAttribute thay vì setFromDateAttribute. Từ những gì tôi biết mutator sử dụng set và accessor sử dụng get
Shulz

Ngày hiện tại trả về này nếu cột rỗng
Bariq Dharmawan,


10

Có 3 cách mà bạn có thể làm:

1) Sử dụng mô hình Laravel

$user = \App\User::find(1);

$newDateFormat = $user->created_at->format('d/m/Y');

dd($newDateFormat);

2) Sử dụng PHP strtotime

$user = \App\User::find(1);

$newDateFormat2 = date('d/m/Y', strtotime($user->created_at));

dd($newDateFormat2);

3) Sử dụng Carbon

$user = \App\User::find(1);

$newDateFormat3 = \Carbon\Carbon::parse($user->created_at)->format('d/m/Y');

dd($newDateFormat3);

9

Phương pháp một:

Sử dụng strtotime()thời gian là định dạng tốt nhất để thay đổi ngày thành định dạng nhất định.

strtotime() - Phân tích cú pháp về bất kỳ mô tả ngày giờ bằng văn bản tiếng Anh nào thành dấu thời gian Unix

Hàm dự kiến ​​sẽ được cung cấp một chuỗi chứa định dạng ngày tiếng Anh và sẽ cố gắng phân tích định dạng đó thành dấu thời gian Unix (số giây kể từ ngày 1 tháng 1 năm 1970 00:00:00 UTC), liên quan đến dấu thời gian được cung cấp hiện tại, hoặc thời gian hiện tại nếu bây giờ không được cung cấp.

Thí dụ:

<?php
$timestamp = strtotime( "February 26, 2007" );  
print date('Y-m-d', $timestamp );
?>

Đầu ra:

2007-02-26

Phương pháp hai:

date_format() - Trả về một đối tượng DateTime mới, rồi định dạng ngày tháng:

<?php
$date=date_create("2013-03-15");
echo date_format($date,"Y/m/d H:i:s");
?>

Đầu ra:

 2013/03/15 00:00:00 

5

Bạn có thể dùng Carbon::createFromTimestamp

LƯỠI

{{ \Carbon\Carbon::createFromTimestamp(strtotime($user->from_date))->format('d-m-Y')}}

4

Tôi đã gặp vấn đề tương tự, tôi muốn thay đổi định dạng, nhưng tôi cũng muốn sự linh hoạt của việc có thể thay đổi định dạng trong công cụ mẫu phiến.

Do đó, tôi thiết lập mô hình của mình như sau:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

\Carbon\Carbon::setToStringFormat('d-m-Y');

class User extends Model
{
    protected $dates = [
        'from_date',
    ];
}

Các setToStringFormatsẽ đặt tất cả các ngày để sử dụng định dạng này cho mô hình này.
Lợi thế của điều này đối với tôi là tôi có thể có định dạng mà tôi muốn mà không có trình đột biến, bởi vì với trình đột biến, thuộc tính được trả về dưới dạng chuỗi có nghĩa là trong mẫu lưỡi kiếm, tôi sẽ phải viết một cái gì đó như thế này nếu tôi muốn thay đổi định dạng trong mẫu:

{{ date('Y', strtotime($user->from_date)) }}

Nó không sạch lắm.

Thay vào đó, thuộc tính vẫn được trả về dưới dạng cá thể Carbon, tuy nhiên, lần đầu tiên nó được trả về ở định dạng mong muốn.
Điều đó có nghĩa là trong mẫu, tôi có thể viết đoạn mã sau, gọn gàng hơn:

{{ $user->from_date->format('Y') }}

Ngoài việc có thể định dạng lại phiên bản Carbon, tôi cũng có thể gọi các phương thức Carbon khác nhau trên thuộc tính trong khuôn mẫu.

Có thể có một sự giám sát đối với cách tiếp cận này; Tôi sẽ đánh cuộc không phải là một ý kiến ​​hay nếu chỉ định định dạng chuỗi ở đầu mô hình trong trường hợp nó ảnh hưởng đến các tập lệnh khác. Từ những gì tôi đã thấy cho đến nay, điều đó đã không xảy ra. Nó chỉ thay đổi Carbon mặc định cho mô hình đó mà thôi.

Trong trường hợp này, có thể là một cách tốt để đặt định dạng Carbon trở lại như ban đầu ở cuối tập lệnh mô hình. Đây là một ý tưởng có cơ sở, nhưng nó sẽ hoạt động đối với mỗi mô hình có định dạng riêng.
Ngược lại, nếu bạn đang có cùng một định dạng cho từng mô hình thì thay vào đó trong AppServiceProvider của bạn. Điều đó sẽ chỉ giữ cho mã gọn gàng hơn và dễ bảo trì hơn.


0

Đôi khi việc thay đổi định dạng ngày không hoạt động đúng cách, đặc biệt là trong Laravel. Vì vậy, trong trường hợp đó, tốt hơn là sử dụng:

$date1 = strtr($_REQUEST['date'], '/', '-');
echo date('Y-m-d', strtotime($date1));

Sau đó, bạn có thể tránh lỗi như "1970-01-01"!


Đó không phải là vấn đề laravel, mà liên quan đến php. Đọc phần này: Ngày trong các định dạng m/d/yhoặc d-m-yđược phân biệt bằng cách nhìn vào dấu phân cách giữa các thành phần khác nhau: nếu dấu phân cách là dấu gạch chéo (/)thì m/d/ygiả định là người Mỹ ; trong khi nếu dấu phân cách là dấu gạch ngang (-)hoặc dấu chấm (.), thì d-m-yđịnh dạng Châu Âu được giả định. Tuy nhiên, nếu năm được cho ở định dạng hai chữ số và dấu phân tách là dấu gạch ngang (-), thì chuỗi ngày được phân tích cú pháp thành y-m-d. php.net/manual/en/function.strtotime.php
Mayank Pandeyz

0

Trong Laravel, bạn có thể thêm một hàm bên trong app / Helper / helper.php như

function formatDate($date = '', $format = 'Y-m-d'){
    if($date == '' || $date == null)
        return;

    return date($format,strtotime($date));
}

Và gọi hàm này trên bất kỳ bộ điều khiển nào như thế này

$start_date = formatDate($start_date,'Y-m-d');

Hy vọng nó giúp!

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.