Meine Vorliebe für das PHP-Framework Laravel habe ich ja schon in dem ein oder anderen Artikel zum Ausdruck gebracht.
In einem aktuellen Projekt musste ich wie so oft eine Menge an Datensätzen auflisten. Diese enthielten auch Datumsangaben die ich aber nicht auf englisch, sondern auf deutsch wollte.
Wie nun das umsetzen?
Nach einigem Suchen habe ich einen Weg gefunden dieses Problem auf sehr leichte und schöne Art und Weise mit Laravel-eigenen Mitteln zu lösen, sogar ohne den bisherigen Code zu beeinflussen.
Alias anlegen
Carbon ist im Prinzip eine API für das php-eigene DateTime, das uns einige nützliche Funktionen liefert. Carbon wird mit Laravel 4 bereits mitgeliefert und kann über \Carbon\Carbon auch verwendet werden. Wer Carbon oft einsetzen will fügt am besten der config/app.php einen Alias hinzu und kann von da an einfach über Carbon auf die Klasse zugreifen. Alternativ can man sie auch per use Anweisung vor die Deklaration von Klassen angeben, die Carbon verwenden werden. Ich habe mich für den Alias entschieden:
'aliases' => array( 'App' => 'Illuminate\Support\Facades\App', // ... 'Validator' => 'Illuminate\Support\Facades\Validator', 'View' => 'Illuminate\Support\Facades\View', 'Carbon' => 'Carbon/Carbon', ),
TimeZone festlegen
Damit php weiß in welcher Sprache es die Zeitangaben ausgeben soll, müssen wir zwei-drei Einstellungen setzen. Nicht alle sind zwingend notwenig, aber sie sind sinnvoll. Zuerst in config/app.php:
/* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. We have gone | ahead and set this to a sensible default for you out of the box. | */ 'timezone' => 'Europe/Berlin', /* |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by the translation service provider. You are free to set this value | to any of the locales which will be supported by the application. | */ 'locale' => 'de',
Nun müssen wir noch irgendwo per php-Funktion setlocale() angeben, welche Sprache verwendet wird. Ich habe das in bootstrap/start.php direkt am Anfang gemacht, andere Orte sind aber denkbar.
setlocale(LC_TIME, 'de_DE');
Carbon
Die Verwendungsmöglichkeiten von Carbon sind vielfältig. Die Dokumentation ist hier sehr hilfreich. Ein paar Beispiele von dort:
$carbon = new Carbon(); // equivalent to Carbon::now() Carbon::parse('first day of December 2008')->addWeeks(2); // 2008-12-15 00:00:00 Carbon::createFromDate($year, $month, $day, $tz); Carbon::createFromTime($hour, $minute, $second, $tz); Carbon::create($year, $month, $day, $hour, $minute, $second, $tz); $dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString(); echo $dt->toDateString(); // 1975-12-25 echo $dt->toFormattedDateString(); // Dec 25, 1975 echo $dt->toTimeString(); // 14:15:16 echo $dt->toDateTimeString(); // 1975-12-25 14:15:16 echo $dt->toDayDateTimeString(); // Thu, Dec 25, 1975 2:15 PM echo Carbon::now()->subDays(5)->diffForHumans(); // 5 days ago echo Carbon::now()->diffForHumans(Carbon::now()->subYear()); // 1 year after
Datum- und Zeit-Felder in Models definieren
Damit wir nicht in den Views oder Models tausend neue Methoden schreiben müssen kann man Laravel ganz einfach anweisen für jedes Feld mit Zeitangabe ein entsprechendes Carbon-Objekt zurückzugeben. Hierzu definiert man im Model eine $dates -Variable und listet darin die Felder auf:
class MyModel extends Eloquent{ protected $dates = array('datum', 'last_edit', 'zeit', 'usw.'); }
Nun gibt Laravel im View beim Auslesen der Felder entsprechend ein Carbon-Objekt aus:
// bisher im View: <p>{{ $datensatz->datum }}</p> // 2014-05-03 12:32:01 // jetzt im View: <p>{{ $datensatz->datum }}</p> // Object Carbon
Da Carbon über die __toString -Methode den „normalen“ DateTime Code ausgibt, konnte ich alle meine Views die diesen schon anders verarbeiteten erstmal unberührt lassen, ohne dass Fehler entstehen.
Lokalisierte Datums- und Zeitangaben im View erstellen
Nun müssen wir nur noch im View das Datum ausgeben. Hierzu stellt Carbon u.a. die Funktion formatLocalized() zur Verfügung:
<span class="datum">{{ $eintrag->datum->formatLocalized('%d. %B %Y') }} </span> -> 17. Mai 2014
Jetzt erhalten wir tatsächlich eine Ausgabe wie wir sie wollen. Natürlich kann man dazu noch die Wochentage usw. ausgeben. Die nötige Hilfe findet man in der php-strftime-Dokumentation.
Fazit
Wenn auch etwas versteckt bietet Larvel jede Menge nützliche Funktionen um Datums- und Zeitangaben zu verwenden. Carbon ist hier ein mächtiges Werkzeug, das in diesem Artikel nur ansatzweise vorgestellt wurde. Viel mehr ist möglich: Das anpassen von Zeitangaben an die Zeitzone des angemeldeten Users zB. oder die Verwendung von „lesbaren“ Zeitangaben wie „vor 3 Minuten.“ Ein Blick in die entsprechende Dokumentation von Carbon eröffnet hier viele Möglichkeiten.
Zusatz: Zeichensatz beachten!
Wenn es zu Darstellungsproblemen mit irgendwelchen ? kommt bei Monatsnamen wie „März“ usw kann man über set_locale auch noch einen Zeichensatz angeben:
setlocale(LC_TIME, 'de_DE.utf8');
2 Antworten auf „Laravel 4: Datum und Zeit mit Carbon lokalisieren (Update: Zeichensatz angeben)“
[…] Datum und Zeit mit Carbon lokalisieren […]
[…] bietet von Haus aus einiges an Zeitfunktionen, die meisten über Carbon (Artikel) […]