Mengubah Format Tanggal di Laravel


Dalam paket instalasi Laravel, disertakan sebuah librari dengan nama Carbon. Librari ini merupakan inherit langsung dari built-in class DateTime dan berfungsi untuk memudahkan manipulasi tanggal dan jam dalam PHP. Sebagai contoh, berikut potongan skrip dalam penggunaan Carbon.

$now = \Carbon\Carbon::now();
Carbon\Carbon {#657
     +"date": "2017-03-04 06:54:17.000000",
     +"timezone_type": 3,
}

Dari variabel $now, kita bisa langung menampilkan output-nya dengan language constructor echo atau fungsi print().

echo $now; // 2017-03-04 06:54:17

Variabel $now yang merupakan instance dari Carbon tersebut juga dapat dimodifikasi, semisal ditambahkan/dimajukan satu hari, kemudian diubah formatnya menjadi d, m Y H:i.

$tomorrow = $now->addDays(1);
Carbon\Carbon {#658
     +"date": "2017-03-05 06:59:07.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
}
$nextMonth = $now->addMonths(1);
echo $tomorrow->format('d, m Y H:i'); // 05, 03 2017 06:59

// next month
echo $tomorrow->format('d, M Y'); // 05, Apr 2017

Tak hanya menyertakan librari Carbon dalam framework, Laravel juga mengintegrasikannya dengan Eloquent ORM.

Sebagai contoh, tabel user memiliki kolom created_at dan updated_at yang secara bawaan definisikan sebagai tipe data datetime. Dalam Eloquent, kedua kolom tersebut direpresentasikan sebagai atribut created_at dan updated_at. Atribut created_at dan updated_at bukanlah berupa string, namun sebuah object yang merupakan instance dari Carbon.

Untuk membuktikannya, kita bisa mengujinya dengan beberapa baris skrip di bawah.

$user = User::find(1);
$user->created_at instanceof \Carbon\Carbon; // true
$user->updated_at instanceof \Carbon\Carbon; // true

Selain created_at dan updated_at, kita juga bisa menentukan sendiri atribut yang jenisnya berupa datetime dengan magic property $dates pada Eloquent. Selangkapnya baca pada halaman berikut.

Nah, oleh karena berupa instance dari class Carbon, maka kita dapat menggunakan method yang ada pada Carbon di atribut created_at dan updated_at.

$user = User::find(1);
$expirationDate =  $user->created_at->addYears(1);
// 2019-04-05 06:59:07
$lastUpdate = $user->updated_at->format('d, M Y H:i');

Dalam Laravel Blade, dapat ditulis seperti contoh di bawah.

Joined at {{ $user->created_at->diffForHumans() }} 
// 4 days ago

Cukup mudah diimplementasikan bukan?

Bagaimana Jika Ingin Membuat Format Tanggal secara Global?

Yah, tentunya cukup merepotkan menggunakan method format() setiap kali ingin menampilkan tanggal yang sesuai dengan format kebutuhan. Lebih repot lagi, ketika ada perubahan format tanggal, maka kita harus mengganti semuanya. Satu per satu.

Bisakah membuat format tanggalnya menjadi global? Dari yang bawaanya berupa format Y-m-d H:i:s menjadi l, d F Y H:i (Tuesday, 28 February 2017 07:20) misalnya. Jawabannya tentu saja bisa.

Untuk contoh kasus ini, kita bisa memanfaatkan salah satu fitur dari Laravel, yaitu Accessor.

Eloquent: Mutators

Accessors and mutators allow you to format Eloquent attribute values when you retrieve or set them on model instances. For example, you may want to use the Laravel encrypter to encrypt a value while it is stored in the database, and then automatically decrypt the attribute when you access it on an Eloquent model.

Pada berkas model user, app\User.php, kita bisa menambahkan method dengan nama getCreatedAtAttribute(). Kemudian, dalam method tersebut tambahkan skrip seperti di bawah.

public function getCreatedAtAttribute()
{
    return \Carbon\Carbon::parse($this->attributes['created_at'])
       ->format('d, M Y H:i');
}

Di level Accessor, tipe data atribut created_at (dan updated_at) masih berupa string. Itulah kenapa kita menggunakan Carbon untuk mengubahnya menjadi object, kemudian mengubah formatnya sesuai dengan contoh kasus di atas.

Hal yang sama juga dapat dilakukan untuk mengubah format atribut updated_at.

public function getUpdatedAtAttribute()
{
    return \Carbon\Carbon::parse($this->attributes['updated_at'])
       ->diffForHumans();
}

Sampai di sini, kita sudah berhasil membuat formatnya berubah secara global. Jika ditampilkan, maka akan berbentuk seperti berikut.

echo $user->created_at; // Tuesday, 28 February 2017 07:20
echo $user->updated_at; // 2 hours ago

Bagaimana Mengubah Bahasanya (locale)?

Carbon sudah menyediakan fitur lokalisasi yang memungkinkan kita menggunakan bahasa sesuai dengan keinginan. Sebagai contoh saya ingin menggunakan bahasa Indonesia.

\Carbon\Carbon::setLocale('id');
echo \Carbon\Carbon::now()->format('l, d F Y H:i');
// Sabtu, 04 Maret 2017 07:38

Agar lokalisasi berlaku secara global di Laravel, tambahkan skrip di bawah pada method boot() dalam berkas app/Providers/AppSserviceProvider.php.

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    \Carbon\Carbon::setLocale('id');

    // jika ingin menyesuaikan dengan dengan locale di laravel
    \Carbon\Carbn::setLocale(config('app.locale'));
}

Masih bingung dalam penggunaan? Atau, terdapat kesalahan dalam contoh? Jangan sungkan untuk memberikan respons positif melalui komentar pos ini. Segala respons akan saya apresiasi dalam bentuk positif pula.

Selamat berkarya! 😄

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

4 comments

Tinggalkan Balasan