เปลี่ยนรูปแบบวันที่ในหน้ามุมมอง laravel


94

ฉันต้องการเปลี่ยนรูปแบบวันที่ที่ดึงมาจากฐานข้อมูล ตอนนี้ฉันได้ 2016-10-01 {{$user->from_date}}ฉันต้องการเปลี่ยนรูปแบบ 'dmy' ใน laravel 5.3

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

คำตอบ:


145

ลองสิ่งนี้:

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

มันจะแปลงวันที่เป็นd-m-Yหรือรูปแบบใดก็ได้ที่คุณกำหนด

หมายเหตุ:โซลูชันนี้เป็นโซลูชันทั่วไปที่ใช้ได้กับ php และเฟรมเวิร์กใด ๆ สำหรับวิธีการเฉพาะ Laravel ลองแก้ไขปัญหาให้โดยHamelraj


2
@ user3386779: มันใช้งานได้ แต่ไม่ใช่วิธีแก้ปัญหาที่สวยงามที่สุด :) Laravel มีกลไกไม่กี่อย่างในการทำสิ่งนี้ หากคุณเลือกคำตอบของฉันคุณต้องตั้งค่ารูปแบบวันที่ในที่เดียวและไม่จำเป็นต้องจำไว้ว่าต้องเปลี่ยนรูปแบบวันที่ทุกครั้งที่คุณต้องการfrom_dateคอลัมน์แสดงผล
Marek Skiba

@MarekSkiba ฉันพูดถึงสิ่งเดียวกันในคำตอบของฉัน :)
Mayank Pandeyz

สิ่งที่เกี่ยวกับการเปลี่ยนภาษาเช่น -> 'es' สำหรับชื่อเดือน
Alberto Acuña

1
เห็นด้วยกับ @sadiq คุณควรใช้ $ user-> from_date-> format ('d / m / Y')
Erik Larsson

1
วิธีแก้ปัญหาที่ยอดเยี่ยมและง่ายมาก
Muddasir23

129

ใน Laravel ใช้คาร์บอนอย่างดี

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

ใช่แล้วเมื่อ $ user-> from_date คือnullอะไร?
lewis4u

1
@ lewis4u ถ้าคุณส่งค่า null เข้าไปparse(null)มันจะแปลงเป็นวันที่เวลาปัจจุบัน
Hamelraj

1
ถูกต้อง ... และนั่นก็ไม่ดีสำหรับบางกรณี! ระวัง!
lewis4u

73

ในชุดโมเดลของคุณ:

protected $dates = ['name_field'];

หลังจากในมุมมองของคุณ:

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

ได้ผล


3
ฉันคิดว่านี่เป็นวิธี "laravel" ที่สุดในการทำเช่นนี้ดังนั้นจึงควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
CodeChuck

ฉันเห็นด้วยเช่นกันนี่เป็นวิธีที่ดีที่สุด
JonaPkr

มันไม่ได้ผลสำหรับฉัน ฉันจะพิจารณาประเภทคอลัมน์วันที่และเวลาและประเภทคอลัมน์เวลา แต่ข้อผิดพลาดยังคงอยู่Call to a member function format() on null
Bariq Dharmawan

36

คุณสามารถตรวจสอบDate Mutators: https://laravel.com/docs/5.3/eloquent-mutators#date-mutators

คุณต้องตั้งค่าในUserคอลัมน์โมเดลของคุณfrom_dateใน$datesอาร์เรย์จากนั้นคุณสามารถเปลี่ยนรูปแบบในรูปแบบ$dateFormat

ตัวเลือกอื่นก็นำวิธีนี้ไปใช้กับUserโมเดลของคุณ:

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

จากนั้นในมุมมองถ้าคุณเรียกใช้{{ $user->from_date }}คุณจะเห็นรูปแบบที่คุณต้องการ


ยอมรับว่านี่เป็นวิธีที่ดีกว่าสำหรับ laravel
limco

1
ข้อเสียอย่างเดียวคือมันจะส่งคืนสตริงไปที่มุมมอง ดังนั้นหากคุณต้องการแสดงรูปแบบวันที่ที่แตกต่างกันในมุมมองเดียวกันคุณจะต้องแยกวิเคราะห์วันที่ด้วย Carbon
JustCarty

ขออภัยเกี่ยวกับเรื่องนี้นี่คือ Mutator เนื่องจากใช้ getFromDateAttribute แทน setFromDateAttribute จากสิ่งที่ฉันรู้ว่า mutator ใช้ set และ accessor ใช้ get
Shulz

วันที่ส่งคืนนี้หากคอลัมน์เป็นโมฆะ
Bariq Dharmawan


10

มี 3 วิธีที่คุณสามารถทำได้:

1) การใช้ Laravel Model

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

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

dd($newDateFormat);

2) การใช้ PHP strtotime

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

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

dd($newDateFormat2);

3) การใช้คาร์บอน

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

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

dd($newDateFormat3);

9

วิธีที่หนึ่ง:

การใช้strtotime()เวลาเป็นรูปแบบที่ดีที่สุดในการเปลี่ยนวันที่เป็นรูปแบบที่กำหนด

strtotime() - แยกวิเคราะห์คำอธิบายวันที่และเวลาที่เป็นข้อความภาษาอังกฤษลงในการประทับเวลา Unix

ฟังก์ชันนี้คาดว่าจะได้รับสตริงที่มีรูปแบบวันที่เป็นภาษาอังกฤษและจะพยายามแยกวิเคราะห์รูปแบบนั้นเป็นการประทับเวลา Unix (จำนวนวินาทีนับตั้งแต่วันที่ 1 มกราคม 1970 00:00:00 UTC) โดยเทียบกับการประทับเวลาที่ระบุในตอนนี้หรือ เวลาปัจจุบันหากไม่ได้ให้มาตอนนี้

ตัวอย่าง:

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

เอาท์พุต:

2007-02-26

วิธีที่สอง:

date_format() - ส่งคืนวัตถุ DateTime ใหม่จากนั้นจัดรูปแบบวันที่:

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

เอาท์พุต:

 2013/03/15 00:00:00 


4

ฉันมีปัญหาคล้ายกันฉันต้องการเปลี่ยนรูปแบบ แต่ฉันก็ต้องการความยืดหยุ่นในการเปลี่ยนรูปแบบในเอนจินแม่แบบใบมีดด้วย

ดังนั้นฉันจึงตั้งค่าโมเดลของฉันดังต่อไปนี้:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

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

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

ซึ่งไม่ค่อยสะอาด

แต่แอตทริบิวต์จะยังคงส่งคืนเป็นอินสแตนซ์ Carbon แต่จะส่งคืนครั้งแรกในรูปแบบที่ต้องการ
นั่นหมายความว่าในเทมเพลตฉันสามารถเขียนโค้ดต่อไปนี้ได้สะอาดกว่า:

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

นอกเหนือจากความสามารถในการฟอร์แมตอินสแตนซ์ Carbon แล้วฉันยังสามารถเรียกใช้วิธี Carbon ต่างๆบนแอตทริบิวต์ในเทมเพลต

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

ในกรณีนี้อาจเป็นการดีที่จะตั้งค่ารูปแบบ Carbon ให้กลับไปเป็นแบบเดิมที่ด้านล่างของสคริปต์โมเดล นี่เป็นแนวคิดที่ผิด แต่จะใช้ได้สำหรับแต่ละรุ่นที่มีรูปแบบของตัวเอง
ตรงกันข้ามหากคุณมีรูปแบบเดียวกันสำหรับแต่ละรุ่นให้ใช้ AppServiceProvider แทน นั่นจะทำให้โค้ดดีขึ้นและดูแลรักษาง่ายขึ้น


0

บางครั้งการเปลี่ยนรูปแบบวันที่ทำงานไม่ถูกต้องโดยเฉพาะใน Laravel ดังนั้นในกรณีนี้ควรใช้:

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

จากนั้นคุณสามารถหลีกเลี่ยงข้อผิดพลาดเช่น "1970-01-01"!


นั่นไม่ใช่ปัญหา laravel ที่เกี่ยวข้องกับ php อ่านสิ่งนี้: วันที่ในm/d/yหรือd-m-yรูปแบบถูกทำให้สับสนโดยดูที่ตัวคั่นระหว่างส่วนประกอบต่างๆ: ถ้าตัวคั่นเป็นเครื่องหมายทับ(/)แสดงm/d/yว่าเป็นแบบอเมริกัน ในขณะที่ตัวคั่นเป็นเส้นประ(-)หรือจุดจะถือว่ารูปแบบ(.)ยุโรป d-m-yแต่ถ้าปีจะได้รับในรูปแบบสองหลักและแยกเป็นเส้นประสตริงวันที่จะแยกวิเคราะห์เป็น (-) php.net/manual/en/function.strtotime.phpy-m-d
Mayank Pandeyz

0

ใน Laravel คุณสามารถเพิ่มฟังก์ชันภายใน app / Helper / helper.php เช่น

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

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

และเรียกใช้ฟังก์ชันนี้บนคอนโทรลเลอร์แบบนี้

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

หวังว่าจะช่วยได้!

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