zmienić format daty na stronie widoku laravel


95

Chcę zmienić format daty, który jest pobierany z bazy danych. teraz mam 2016-10-01 {{$user->from_date}}.Chcę zmienić format 'dmy' w laravel 5.3

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

Odpowiedzi:


149

Spróbuj tego:

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

Konwertuje datę na d-m-Ylub inny podany przez Ciebie format.

Uwaga: To rozwiązanie jest ogólnym rozwiązaniem, które działa dla PHP i wszystkich jego frameworków. W przypadku metody specyficznej dla Laravel wypróbuj rozwiązanie dostarczone przez Hamelraj .


2
@ user3386779: Działa, ale nie jest najpiękniejszym rozwiązaniem :) Laravel ma kilka mechanizmów, które to robią. Jeśli wybierzesz moją odpowiedź, musisz ustawić format daty w jednym miejscu i nie musisz pamiętać o zmianie formatu daty za każdym razem, gdy potrzebujesz from_datekolumny wyświetlania .
Marek Skiba

@MarekSkiba W mojej odpowiedzi wspomniałem o tym samym :)
Mayank Pandeyz

co na przykład zmienić język -> „es” od miesięcy imiona
Alberto Acuña

1
Zgadzam się z @sadiq, powinieneś użyć $ user-> from_date-> format ('d / m / Y')
Erik Larsson,

1
Świetne i bardzo proste rozwiązanie.
Muddasir

131

W Laravel używaj węgla, to dobrze

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

tak, a co, gdy $ user-> from_date to null?
lewis4u

1
@ lewis4u, jeśli podasz do parse(null)niego wartość null , zostanie przekonwertowana na aktualną datę i godzinę
Hamelraj

1
Dobrze ... a to nie jest dobre w niektórych przypadkach! Więc uważaj!
lewis4u

78

W Twoim zestawie modeli:

protected $dates = ['name_field'];

po twoim zdaniem:

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

Pracuje


3
Myślę, że jest to najbardziej „laravel” sposób, aby to zrobić, więc to powinno być oznaczone jako poprawna odpowiedź.
CodeChuck

też się zgadzam, to najlepszy sposób
JonaPkr

Na mnie to nie działa. Powiedziałbym już o typie kolumny z Call to a member function format() on null
datą

37

Możesz sprawdzić Date Mutators: https://laravel.com/docs/5.3/eloquent-mutators#date-mutators

Musisz ustawić Userkolumnę modelu from_datew $datestablicy, a następnie możesz zmienić format w$dateFormat

Inną opcją jest również wprowadzenie tej metody do twojego Usermodelu:

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

a wtedy, jeśli uruchomisz {{ $user->from_date }}, zobaczysz żądany format.


zgadzam się, że jest to lepszy sposób dla laravel
limco

1
Jedyną wadą jest to, że zwróci ciąg do widoku; więc jeśli chcesz wyświetlać różne formaty dat w tym samym widoku, będziesz musiał ponownie przeanalizować datę za pomocą Carbon.
JustCarty

Przepraszam za to, czy to jest mutator, ponieważ używa getFromDateAttribute zamiast setFromDateAttribute. Z tego co wiem, mutator używa set, a akcesor używa get
Shulz


14

Łatwa w użyciu data w szablonie ostrza wykorzystuje w ten sposób Carbon

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

11

Możesz to zrobić na 3 sposoby:

1) Korzystanie z modelu Laravel

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

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

dd($newDateFormat);

2) Korzystanie z PHP strtotime

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

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

dd($newDateFormat2);

3) Korzystanie z węgla

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

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

dd($newDateFormat3);

10

Metoda pierwsza:

strtotime()Najlepszym formatem do zmiany daty na podany format jest użycie czasu do.

strtotime() - Przetwórz dowolny angielski tekstowy opis daty i godziny w uniksowy znacznik czasu

Funkcja oczekuje, że otrzyma ciąg zawierający datę w angielskim formacie i spróbuje przeanalizować ten format na znacznik czasu uniksowego (liczbę sekund od 1 stycznia 1970 00:00:00 UTC), w odniesieniu do sygnatury czasowej podanej w now, lub aktualny czas, jeśli nie jest podany.

Przykład:

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

Wynik:

2007-02-26

Metoda druga:

date_format() - Zwróć nowy obiekt DateTime, a następnie sformatuj datę:

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

Wynik:

 2013/03/15 00:00:00 

5

Możesz użyć Carbon::createFromTimestamp

NÓŻ

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

4

Miałem podobny problem, chciałem zmienić format, ale chciałem też mieć możliwość zmiany formatu w silniku szablonów blade.

Dlatego ustawiłem mój model w następujący sposób:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

setToStringFormatUstawia wszystkie daty, aby używać tego formatu dla tego modelu.
Zaletą tego dla mnie jest to, że mogłem mieć format jaki chciałem bez mutatora, bo przy mutatorze atrybut jest zwracany jako string co oznacza że w szablonie ostrza musiałbym coś takiego napisać gdybym chciał zmień format w szablonie:

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

Co nie jest zbyt czyste.

Zamiast tego atrybut jest nadal zwracany jako instancja Carbon, jednak najpierw jest zwracany w żądanym formacie.
Oznacza to, że w szablonie mógłbym napisać następujący, bardziej przejrzysty kod:

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

Oprócz możliwości ponownego formatowania instancji Carbon mogę również wywoływać różne metody Carbon w atrybucie w szablonie.

Prawdopodobnie istnieje przeoczenie w tym podejściu; Założę się, że nie jest dobrym pomysłem określanie formatu ciągu na górze modelu, na wypadek gdyby miał on wpływ na inne skrypty. Z tego, co do tej pory widziałem, tak się nie stało. Zmienił tylko domyślny Carbon tylko dla tego modelu.

W tym przypadku może to być dobre ustawienie formatu Carbon z powrotem na to, co pierwotnie znajdowało się na dole skryptu modelowego. To jest pomysł, ale dobrze by było, gdyby każdy model miał swój własny format.
Wręcz przeciwnie, jeśli masz ten sam format dla każdego modelu, zamiast tego w swoim AppServiceProvider. Dzięki temu kod byłby po prostu schludniejszy i łatwiejszy w utrzymaniu.


0

Czasami zmiana formatu daty nie działa poprawnie, szczególnie w Laravel. W takim przypadku lepiej użyć:

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

Wtedy możesz uniknąć błędów typu „1970-01-01”!


To nie jest problem laravel, związany z php. Przeczytaj to: Daty w formatach m/d/ylub d-m-ysą ujednoznaczniane, patrząc na separator między różnymi składnikami: jeśli separatorem jest ukośnik (/), m/d/yzakłada się, że jest to znak amerykański ; natomiast jeśli separatorem jest myślnik (-)lub kropka (.), d-m-yto zakłada się format europejski . Jeśli jednak rok jest podany w formacie dwucyfrowym, a separatorem jest myślnik (-), ciąg daty jest analizowany jako y-m-d. php.net/manual/en/function.strtotime.php
Mayank Pandeyz

0

W Laravel możesz dodać funkcję w app / Helper / helper.php, np

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

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

I wywołaj tę funkcję na dowolnym kontrolerze takim jak ten

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

Mam nadzieję, że to pomoże!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.