Tarih ve Saat

Nette, tarih ve saatle çalışmak için iki sınıf sunar: Nette\Utils\DateTimeImmutable (değişmez, önerilen) ve Nette\Utils\DateTime (değişebilir). İkisi de PHP'nin yerleşik sınıflarını genişletir, dolayısıyla tüm yerleşik metotlar kullanılabilir kalır; üstüne aynı iki iyileştirmeyi eklerler.

Birincisi, katıdırlar. PHP 0000-00-00 (-0001-11-30 yapar) veya 2024-02-31 (2024-03-02 yapar) gibi geçersiz tarihleri sessizce kabul ederken, bu sınıflar bunun yerine istisna fırlatır.

İkincisi, yaz saati uygulamasına (DST) geçişlerdeki davranışı düzeltirler; yerleşik PHP'de göreli bir süre eklemek (örneğin +100 dakika), daha kısa bir süre eklemekten (örneğin +50 dakika) daha erken bir zaman verebiliyor. Bu sınıflar aritmetiğin sezgisel çalışmasını sağlar ve +100 dakika her zaman +50 dakikadan fazladır.

Kurulum:

composer require nette/utils

Değişmez mi, Değişebilir mi?

DateTimeImmutable sınıfı 4.1.5 sürümünden beri kullanılabilir ve önerilen seçimdir. Değişiklik yapan her metot, özgün nesneyi değiştirmek yerine yeni bir örnek döndürür; böylece sakladığınız veya bir fonksiyona aktardığınız bir nesne asla beklenmedik şekilde değişmez:

use Nette\Utils\DateTimeImmutable;

$date = new DateTimeImmutable('2024-02-26');
$next = $date->modify('+1 day');
echo $date; // 2024-02-26 00:00:00  (değişmedi)
echo $next; // 2024-02-27 00:00:00  (yeni bir nesne)

DateTime ise değişebilirdir: aynı çağrı nesneyi yerinde değiştirir. Kullanımdan kaldırılmış değildir, ama yeni kodda değişmez varyant tercih edilir.

use Nette\Utils\DateTime;

$date = new DateTime('2024-02-26');
$date->modify('+1 day');
echo $date; // 2024-02-27 00:00:00  (özgün nesne değişti)

Her iki sınıf da yerleşik sınıfları genişlettiğinden, zaten bildiğiniz metotları kullanmayı sürdürürsünüz: format(), getTimestamp(), add(), sub(), diff(), setTimezone(), karşılaştırma operatörleri vb. DateTimeImmutable üzerinde değişiklik yapanların tümü yeni bir örnek döndürür. Bu sayfanın kalanı yalnızca Nette'nin bunlara eklediklerini anlatır; aksi belirtilmedikçe her şey iki sınıfta da aynı şekilde çalışır.

Nesne Oluşturma

static from (string|int|\DateTimeInterface|null $time)static

Bir dizeden, UNIX zaman damgasından veya başka bir DateTimeInterface nesnesinden nesne oluşturur. null geçerli zamanı belirtir. Tarih ve saat geçerli değilse istisna fırlatır.

DateTimeImmutable::from(1_138_013_640); // UNIX zaman damgasından, varsayılan saat dilimiyle
DateTimeImmutable::from('1994-02-26 04:15:32'); // dizeden
DateTimeImmutable::from('1994-02-26'); // tarihten, saat 00:00:00 olur
DateTimeImmutable::from(null); // geçerli tarih ve saat

static fromParts (int $year, int $month, int $day, int $hour=0, int $minute=0, float $second=0.0)static

Nesneyi tek tek parçalarından oluşturur; tarih ve saat geçerli değilse istisna fırlatır.

DateTimeImmutable::fromParts(1994, 2, 26, 4, 15, 32);

static createFromFormat (string $format, string $datetime, string|\DateTimeZone|null $timezone=null): static|false

Yerleşik DateTime::createFromFormat metodunu, saat dilimini dize olarak belirtme olanağıyla genişletir.

DateTimeImmutable::createFromFormat('d.m.Y', '26.02.1994', 'Europe/London');

Katı Doğrulama

Geçersiz bir tarih ya da saat asla sessizce düzeltilmez; her zaman istisna fırlatılır. Bu, nesnenin oluşturulduğu veya değiştirildiği her yol için geçerlidir: yapıcı, from(), fromParts() ile setDate() ve setTime() metotları.

new DateTimeImmutable('2024-02-31');         // istisna (şubatın 31'i yok)
DateTimeImmutable::fromParts(2024, 2, 31);   // istisna
$date->setDate(2024, 2, 31);                 // istisna
$date->setTime(25, 0);                       // istisna (25. saat diye bir şey yok)

Dize Çıktısı ve JSON

__toString(), tarih ve saati Y-m-d H:i:s biçiminde döndürür; böylece nesne doğrudan yazdırılabilir veya birleştirilebilir:

echo $date; // '2017-02-03 04:15:32'

Her iki sınıf da JsonSerializable uygular ve JavaScript'te yaygın olarak kullanılan ISO 8601 biçiminde serileştirilir:

echo json_encode($date); // '"2017-02-03T04:15:32+01:00"'

DateTime'ın Ek Özellikleri

Değişebilir DateTime, yalnızca değişebilir bir nesne için anlamlı olan ve bu yüzden DateTimeImmutable'da yer almayan birkaç ek üye taşır.

Onun from() metodu, küçük bir sayıyı geçerli zamandan itibaren saniye cinsinden bir kayma olarak da ele alır. Değişmez varyant bu kısayolu bilinçli olarak dışarıda bırakır; orada bir sayı her zaman gerçek bir zaman damgasıdır.

DateTime::from(42); // geçerli zaman artı 42 saniye

modifyClone(string $modify=''): static, değiştirilmiş bir kopya döndürür ve özgün nesneye dokunmaz. Değişebilir bir nesnede, değişmez nesnede modify()'ın zaten sunduğu şeyi sağlar:

$original = DateTime::from('2017-02-03');
$clone = $original->modifyClone('+1 day');
$original->format('Y-m-d'); // '2017-02-03'  (değişmedi)
$clone->format('Y-m-d');    // '2017-02-04'

DateTime::relativeToSeconds(string $relativeTime): int, göreli zaman dizesini saniyeye dönüştürür:

DateTime::relativeToSeconds('1 minute'); // 60
DateTime::relativeToSeconds('-1 hour'); // -3600

Son olarak DateTime, saniye cinsinden uzunluk belirten MINUTE, HOUR, DAY, WEEK, MONTH ve YEAR sabitlerini tanımlar; MONTH ve YEAR ortalama değerlerdir, bu yüzden yalnızca kaba tahminlerde kullanın.

versiyon: 4.x