Carbon ile Laravel'de Tarih Yönetimi

939

Adını arkeolojik kazılarda, buluntuların yaşını/dönemini anlayabilmek için yapılan radyoaktif 14C (radyokarbon) izotopundan alan, Laravel'de kullanılan bir PHP uzantısı olan Carbon'dan bahsetmek istiyorum. Günümüz uygulamalarının tarihle ilgili bir şeyler yapmadığı bir senaryo yok gibi bir şey. Haliyle hem kullanıcı girişlerinden hem de hali hazırda üretilmiş olan tarhilere göre tutarlı hesaplama yapmak oldukça hayati bir işlem olabilir. Kullanım süresi dolan ürünler, teslimat tarileri ya da en basitinden kullanıcının doğum günün kutlama... Buna benzer onlarca yüzlerce örnek yazılabilir.

İşte hal böyleyken, Laravel ekibi de kendi kütüphanalerini yazmaktansa doğrusunu yapıp bu işi gerçekten layıkıyla yapan Carbon'u Laravel'e dahil etmişler. Carbon ile tarih namına yapamayacağınız bir şey yok gibi. En azından benim aklımdan geçen her şeyin kütüphaneye eklendiğini gördüm. Rehber olması açısından bazı kullanım örneklerini de buraya eklemek istetim. Tamamını yazmak gibi bir şansımız yok gibi bir şey. Ne demek istediğimi Nestbot'un sayfasına bakarsanız anlayacağınızı düşünüyorum. Bir Blade sayfası içinde kullanabileceğiniz şekliyle örnekleri aşağıya ekliyorum.

@php
    use Carbon\Carbon;
    Carbon::setLocale('tr');

    $date1 = '2010-03-15 22:15:51';
    $date2 = '2020-07-22 13:45:18';
    $date3 = '2030-04-10 15:12:44';

    $month = '2'; //String
    $day = 9; //Integer
    $year = 1970; //Integer
    $tz = 'Europe/Istanbul';
@endphp

{{Carbon::now()}} // 2024-01-17 13:56:25
{{Carbon::now()->year}} // 2024
{{Carbon::now()->month}} // 1
{{Carbon::now()->day}} // 17
{{Carbon::now()->hour}} // 13
{{Carbon::now()->minute}} // 56
{{Carbon::now()->second}} // 25
{{Carbon::now()->dayOfWeek}} // 3 
{{Carbon::now()->dayOfYear}} // 17
{{Carbon::now()->weekOfMonth}} // 3 
{{Carbon::now()->daysInMonth}} // 31
{{Carbon::now()->daysInYear}} // 366

{{Carbon::today()}} // 2024-01-17 00:00:00
{{Carbon::yesterday()}} // 2024-01-16 00:00:00
{{Carbon::tomorrow()}} // 2024-01-18 00:00:00
{{Carbon::parse('last day of february 2025')}} // 2025-02-28 00:00:00
{{Carbon::createFromDate($year, $month, $day, $tz)}} // 1970-02-09 13:56:25

{{Carbon::parse($date1)}}  // 2010-03-15 22:15:51
{{Carbon::parse($date1)->format('d-m-Y')}}  // 15-03-2010
{{Carbon::parse($date1)->format('d-m-Y H:i:s')}}  // 15-03-2010 22:15:51
{{Carbon::parse($date1)->format('D, d M Y H:i:s')}}  // Mon, 15 Mar 2010 22:15:51
{{Carbon::parse($date1)->translatedFormat('D, d F Y H:i:s')}}  // Pts, 15 Mart 2010 22:15:51

{{Carbon::parse($date1)->diffInDays($date2)}}  // 3781
{{Carbon::parse($date1)->diffInMonths($date2)}}  // 124
{{Carbon::parse($date1)->diffInYears($date2)}}  // 10
{{Carbon::parse($date1)->diffForHumans($date2)}}  // 10 yıl önce

{{Carbon::now()->isBirthday()}}  // 1
{{Carbon::parse($date2)->isPast()}}  // 1
{{Carbon::parse($date3)->isFuture()}}  // 1
{{Carbon::parse($date3)->diffInDays(now())}}  // 2275

{{Carbon::parse($date1)->format('c')}} // 2010-03-15T22:15:51+02:00 //ISO 8601
{{Carbon::parse($date1)->format('e')}} // Europe/Istanbul

{{Carbon::parse($date1)->addMonths('3')}} // 2010-06-15 22:15:51
{{Carbon::parse($date1)->subMonths('3')}} // 2009-12-15 22:15:51
{{Carbon::parse($date1)->addYears('3')}} // 2013-03-15 22:15:51
{{Carbon::parse($date1)->subYears('3')}} // 2007-03-15 22:15:51

Burada dikkat çekmek istediğim bir nokta var. Laravel içinde varsayılan lokalizasyon, sizin uygulamanızın ayarlarından alınır. Ama duruma ya da sayfaya göre yerelleştirme yapmak istiyorsanız sayfa içinde yukarıda olduğu gibi setLocale değişkenini override etmeyi unutmayınız. Zaten örneklerde de görüldüğü üzere translatedFormat kullanımı ile varsayılan İngilizce dilinden Türkçeye çevirildiğini görürsünüz. Ben herhangi bir çeviri de yapmadım. Hali hazırda pakette gerekli çeviriler mevcut. Ayrıca formatla ilgili kısaltmaları da aşağıdaki listeden inceleyebilirsiniz. Tabloyu kaynağından aldım ve çevirmeye üşendim :)

Code Example Description
OD 5 Day number with alternative numbers such as 三 for 3 if locale is ja_JP
OM 1 Month number with alternative numbers such as ၀၂ for 2 if locale is my_MM
OY 2017 Year number with alternative numbers such as ۱۹۹۸ for 1998 if locale is fa
OH 17 24-hours number with alternative numbers such as ႑႓ for 13 if locale is shn_MM
Oh 5 12-hours number with alternative numbers such as 十一 for 11 if locale is lzh_TW
Om 4 Minute number with alternative numbers such as ୫୭ for 57 if locale is or
Os 5 Second number with alternative numbers such as 十五 for 15 if locale is ja_JP
D 5 Day of month number (from 1 to 31)
DD 05 Day of month number with trailing zero (from 01 to 31)
Do 5th Day of month with ordinal suffix (from 1st to 31th), translatable
d 4 Day of week number (from 0 (Sunday) to 6 (Saturday))
dd Th Minified day name (from Su to Sa), translatable
ddd Thu Short day name (from Sun to Sat), translatable
dddd Thursday Day name (from Sunday to Saturday), translatable
DDD 5 Day of year number (from 1 to 366)
DDDD 005 Day of year number with trailing zeros (3 digits, from 001 to 366)
DDDo 5th Day of year number with ordinal suffix (from 1st to 366th), translatable
e 4 Day of week number (from 0 (Sunday) to 6 (Saturday)), similar to "d" but this one is translatable (takes first day of week of the current locale)
E 4 Day of week number (from 1 (Monday) to 7 (Sunday))
H 17 Hour from 0 to 23
HH 17 Hour with trailing zero from 00 to 23
h 5 Hour from 0 to 12
hh 05 Hour with trailing zero from 00 to 12
k 17 Hour from 1 to 24
kk 17 Hour with trailing zero from 01 to 24
m 4 Minute from 0 to 59
mm 04 Minute with trailing zero from 00 to 59
a pm Meridiem am/pm
A PM Meridiem AM/PM
s 5 Second from 0 to 59
ss 05 Second with trailing zero from 00 to 59
S 0 Second tenth
SS 08 Second hundredth (on 2 digits with trailing zero)
SSS 084 Millisecond (on 3 digits with trailing zeros)
SSSS 0845 Second ten thousandth (on 4 digits with trailing zeros)
SSSSS 08451 Second hundred thousandth (on 5 digits with trailing zeros)
SSSSSS 084512 Microsecond (on 6 digits with trailing zeros)
SSSSSSS 0845120 Second ten millionth (on 7 digits with trailing zeros)
SSSSSSSS 08451200 Second hundred millionth (on 8 digits with trailing zeros)
SSSSSSSSS 084512000 Nanosecond (on 9 digits with trailing zeros)
M 1 Month from 1 to 12
MM 01 Month with trailing zero from 01 to 12
MMM Jan Short month name, translatable
MMMM January Month name, translatable
Mo 1st Month with ordinal suffix from 1st to 12th, translatable
Q 1 Quarter from 1 to 4
Qo 1st Quarter with ordinal suffix from 1st to 4th, translatable
G 2017 ISO week year
GG 2017 ISO week year (on 2 digits with trailing zero)
GGG 2017 ISO week year (on 3 digits with trailing zeros)
GGGG 2017 ISO week year (on 4 digits with trailing zeros)
GGGGG 02017 ISO week year (on 5 digits with trailing zeros)
g 2017 Week year according to locale settings, translatable
gg 2017 Week year according to locale settings (on 2 digits with trailing zero), translatable
ggg 2017 Week year according to locale settings (on 3 digits with trailing zeros), translatable
gggg 2017 Week year according to locale settings (on 4 digits with trailing zeros), translatable
ggggg 02017 Week year according to locale settings (on 5 digits with trailing zeros), translatable
W 1 ISO week number in the year
WW 01 ISO week number in the year (on 2 digits with trailing zero)
Wo 1st ISO week number in the year with ordinal suffix, translatable
w 1 Week number in the year according to locale settings, translatable
ww 01 Week number in the year according to locale settings (on 2 digits with trailing zero)
wo 1st Week number in the year according to locale settings with ordinal suffix, translatable
x 1483635845085 Millisecond-precision timestamp (same as date.getTime() in JavaScript)
X 1483635845 Timestamp (number of seconds since 1970-01-01)
Y 2017 Full year from -9999 to 9999
YY 17 Year on 2 digits from 00 to 99
YYYY 2017 Year on 4 digits from 0000 to 9999
YYYYY 02017 Year on 5 digits from 00000 to 09999
YYYYYY +002017 Year on 5 digits with sign from -09999 to +09999
z UTC Abbreviated time zone name
zz UTC Time zone name
Z +00:00 Time zone offset HH:mm
ZZ +0000 Time zone offset HHmm