Alıntı: UnfoldCMS’de ilk olarak yayımlanmıştır. (UnfoldCMS’de çalışıyorum.)
<p>Birçok tarih kütüphanesi, bir takvim ile harika bir API sunarken diğer takvimler için yarı performans sunuyor. Uygulamanız İran, Afganistan veya Körfez bölgesindeki kullanıcılara hizmet veriyorsa, bir gün birisi Jalali takvimini Gregoryen takvimle yan yana isterse, bu durum sorun haline gelir.</p>
<p><strong>TL;DR:</strong> <a href="https://carbon.nesbot.com/" target="_blank" rel="noopener noreferrer">Carbon</a>, PHP'de tarihler için standarttır ancak sadece Gregoryen ile çalışır. MultiCarbon, Carbon'ı genişleten küçük bir açık kaynak paketidir; Jalali (Güneş Hijri) ve Hijri (İslami Ay) takvimlerini ekler — böylece <code>format()</code>, <code>addMonths()</code>, <code>diffForHumans()</code> ve Laravel entegrasyonu çalışmaya devam eder, istediğiniz takvimde. Bu yazı, gerçek bir Laravel uygulamasında nasıl kullanılacağını gösterir, bu gün uygulamanıza yapıştırabileceğiniz kodlarla. Bu paket MIT lisansı altındadır ve <a href="https://unfoldcms.com/" target="_blank" rel="noopener noreferrer">UnfoldCMS</a>'in bir parçası olarak oluşturulmuştur.</p>
<hr/>
<h2>
<a name="the-problem-carbon-only-knows-one-calendar" href="#the-problem-carbon-only-knows-one-calendar"></a>
Sorun: Carbon Sadece Bir Takvimi Tanır
</h2>
<p>Carbon mükemmel bir kütüphanedir. Zaman dilimlerini yönetir, tarih farkı alır, değişmezlik sağlar ve Laravel'e derin entegre edilir — <code>$user->created_at</code> doğrudan bir Carbon nesnesidir. Sorun, Carbon'un sadece Gregoryen takvimle çalışmasıdır.</p>
<p>Bir Jalali tarihi gereksiniminiz olduğunda, geçmişte iki kötü seçeneğiniz vardı:</p>
<ol>
<li>
<strong>Ayrı bir Jalali kütüphanesi</strong> - çalışıyor ancak ayrı bir nesne türüdür. Carbon'un zaman dilimi yönetimi, tarih farkı hesaplama ve Laravel dönüşümleri kaybedilir. Artık kodunuzun her yerinde geri dönüşüm yapmanız gerekir.</li>
<li>
<strong>Ince bir sarmalayıcı</strong> - daha yakın, ancak çoğu sarmalayıcı Carbon'un yüzeyinin bir kısmını yeniden uygular. Unuttukları bir yöntemi çağırdığınızda, sistem çöker.</li>
</ol>
<p>İki yolun sonu aynı: bir uygulama içinde tarihler için iki zihinsel model tutarsınız. İşte burada hatalar doğar.</p>
<hr/>
<h2>
<a name="what-multicarbon-does-differently" href="#what-multicarbon-does-differently"></a>
MultiCarbon Ne Yapıyor?
</h2>
<p>MultiCarbon <strong>Carbon\Carbon</strong> uzantısı olarak çalışır; bu tasarım kararı her şeyi değiştirir. Çünkü bir <code>MultiCarbon</code> örneği <em>bir</em> Carbon örneğidir, bu nedenle her Carbon metodu çalışır — yalnızca herhangi bir örnekte aktif takvimi değiştirme yeteneği kazanırsınız.</p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="kn">use</span> <span class="nc">MultiCarbon\MultiCarbon</span><span class="p">;</span>// Jalali takvimde bir tarih oluştur
$date = MultiCarbon::createJalali(1404, 1, 1); // Nowruz 1404
echo $date->format(<span class=”s1>’Y/m/d’); // “1404/01/01”
echo $date->format(<span class=”s1>’l j F Y’); // “جمعه 1 فروردین 1404”
// Aynı örnek, farklı takvim — zaman damgası sabit kalır
echo $date->hijri()->format(<span class=”s1>’Y/m/d’); // “1446/08/21”
echo $date->gregorian()->format(<span class=”s1>’Y/m/d’); // “2025/03/21”
<p>Temel Unix zaman damgası sabit kalır. <code>->jalali()</code>, <code>->hijri()</code>, ve <code>->gregorian()</code> yalnızca tarihi nasıl <em>okur ve gösterir</em> — zaman açısından sabit durur. İşte bu kütüphanenin özelliği ve başka hiçbiri bozulmaz.</p>
<h3>
<a name="its-still-just-carbon" href="#its-still-just-carbon"></a>
Hala Sadece Carbon
</h3>
<p>Gerçek bir kod tabanı için önemli olan kısım bu. Bugüne kadar kullandığınız her Carbon metodu, Jalali veya Hijri modunda çalışmaya devam eder:</p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="nv">$date</span> <span class="o">=</span> <span class="nc">MultiCarbon</span><span class="o">::</span><span class="nf">createJalali</span><span class="p">(</span><span class="mi">1404</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>$date->addDays(10); // Carbon için yerel
$date->addMonths(2); // takvim değerli (2 Jalali ay)
$date->isPast(); // doğru / yanlış
$date->isWeekend(); // Cuma tespiti (İran haftası)
$date->diffForHumans(); // “۳ ماه پیش” — yerelleştirilmiş Farsça
$date->getTimestamp(); // doğru Unix zaman damgası
$date->timezone(<span class=”s1>’Asia/Tehran’); // tam zaman dilimi desteği
$date->copy()->startOfMonth(); // 1404/06/01 00:00:00
// Carbon bekleyen her şeye verin — sadece çalışır
function logDate(\Carbon\Carbon $d) { / … / }
logDate($date); // MultiCarbon, gerçekten Carbon’dır


