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')}}
user3386779
źródło

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 .

Mayank Pandeyz
źródło
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')}}
Hamelraj
źródło
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

HorecioDias
źródło
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.

Marek Skiba
źródło
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
Zwraca
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')}}
Umar Tariq
źródło
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);
Dibyendu Mitra Roy
źródło
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 
Naresh Kumar P.
źródło
5

Możesz użyć Carbon::createFromTimestamp

NÓŻ

{{ \Carbon\Carbon::createFromTimestamp(strtotime($user->from_date))->format('d-m-Y')}}
kosta
źródło
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.

JustCarty
źródło
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”!

Uczciwy rycerz
źródło
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!

Prasant Kumar
źródło