Photo by Murray Campbell on Unsplash

.NET 6: DateOnly ve TimeOnly

Halil İbrahim Kocaöz
2 min readSep 13, 2021

--

.NET teknolojileri ile geliştirme yapanlar uzun bir süredir DateTime tipini kullanıyordu. Bu tip ile sadece Date veya sadece Time ile çalışılacağı durumlarda işler sarpa sarıyordu veya ihtiyaç duyulmayan veriler ile uğraşılıyordu ve DateTime dışında tam anlamıyla işe yarar başka bir alternatifleri yoktu.

Artık var, DateOnly ve TimeOnly .NET 6 previewleri ile duyuruldu. Bu iki yeni yapıya biraz göz atalım.

TimeOnly

Bir .NET developer sadece zamanı saklamak veya işlemek istiyorsa, işte o zaman onun başı gerçekten belaya girebiliyordu. TimeSpan ile sadece zamanlar arasında işlem yaparken 12(veya 24) saatlik zaman ile bir iş saat 6 PM’de başladıysa ve 8 saat sürdüyse, zamanı 2:00 AM olarak ayarlamak için bile ayriyeten bir çaba sarf ediliyordu. Üstelik Date verisine ihtiyacı olmamasına rağmen Time verilerini işlerken Date verileriyle de uğraşmak zorunda kalınabiliyordu.

TimeOnly tipini kullanırken aşağıda gördüğünüz constructorları kullanabilirsiniz veya string tipinden de parse edebilirsiniz.

public TimeOnly(long ticks)
public TimeOnly(int hour, int minute)
public TimeOnly(int hour, int minute, int second)
public TimeOnly(int hour, int minute, int second, int millisecond)

TimeOnly tipinin dikkatimi çeken bazı özellikleri,

var maxTimeValue = TimeOnly.MaxValue;
Console.WriteLine(maxTimeValue); // 23:59 - 11:59 PM (CultureInfo'a göre değişir)

Yukarıda söz edilen sorun için, zaman dilimini doldurmaya örnek ve string tipinden TimeOnly tipine parse etme işlemi.

var baslangicZamani = TimeOnly.Parse("6:00 PM"); // 18:00
var calisilanSaat = 8;
var bitisZamani = baslangicZamani.AddHours(calisilanSaat);
Console.WriteLine(bitisZamani); // 2:00 - 2:00 AM (CultureInfo'a göre değişir)

TimeSpan objesi kullanırken oluşacak taşmalara dikkat etmemiz gerekiyordu, artık böyle bir gereklilik yok.

TimeOnly için diğer dikkat çeken bir özellik ise IsBetween extension metotu. Belirli bir zamanın, diğer belirli iki zaman arasında olup olmadığını kontrol edilmesine yarar.

var baslangicZamani = new TimeOnly(22, 0);
var bitisZamani = new TimeOnly(2, 0);
var aradakiZaman = new TimeOnly(1, 30);
bool isBetween = aradakiZaman.IsBetween(baslangicZamani, bitisZamani);Console.WriteLine(isBetween); // true

DateOnly

Yalnızca tarih kullanımına örnekler vermek gerekirse: doğum günleri gibi zamandan bağımsız buna benzer herhangi bir takvim tarihi. DateTime ile birlikte, zamansız tarih tipine sahip bir SQL veritabanıyla çalışmaksa oldukça garipti.

DateOnly tarafında Custom Format dışında ilgimi çeken pek bir şey olmadı yine de DateTime’da gördüğümüz gibi kafa karıştırıcı gereksiz bilgileri ortadan kaldırıyor. Time bilgisi olmadan sadece Date bilgisi:

var maxDateValue = DateOnly.MaxValue;
Console.WriteLine(maxDateValue); // 12/31/9999 - zamana dair bir bilgi yok

DateOnly için aşağıdaki constructorları kullanabilirsiniz

public DateOnly(int year, int month, int day)
public DateOnly(int year, int month, int day, Calendar calendar)

veya string tipinden Parse edebilirsiniz

bool TryParse (string? s, IFormatProvider? provider, DateTimeStyles style, out DateOnly result);

Custom Format

var date = DateOnly.ParseExact("29 10 1923", "dd MM yyyy", CultureInfo.InvariantCulture);

Sonuç

Microsoft ihtiyaçları dinleyip, iki önemli tipi .NET 6 ile birlikte .NET yazılımcılarına kazandırmış. Bence DateTime’ı sıkça görmeye devam edeceğiz ama bu iki tip yeni projelerimizde bazı işleri oldukça kolaylaştıracak.

--

--