Menu

C# DateTime ve TimeSpan: Now, UtcNow, Ekleme, Çıkarma, Karşılaştırma ve Parse

C#'ta tarih ve saatlerle çalışmak: DateTime değerleri oluşturmak, Now, UtcNow ve Today farkı, gün ve ay eklemek, çıkararak bir TimeSpan elde etmek, TotalHours ve Hours farkı, tarihleri karşılaştırmak, DayOfWeek, ParseExact ve TryParse ile parse etmek, DateTimeOffset ve DateOnly.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

System.DateTime, 1. yıldan 9999. yıla kadar, 100 nanosaniye (bir "tick") hassasiyetle bir tarihi ve günün bir saatini temsil eder. System.TimeSpan ise bir süreyi temsil eder: iki DateTime değeri arasındaki fark. İkisi de değiştirilemez değer tipleridir (struct'lar), bu yüzden her işlem yeni bir değer döndürür.

Çıktı:

2026-09-24 00:00:00
2026-09-24 14:30:00
14:30:05.250
2026 9 24
14:30
Thursday
267
2026-09-24 00:00
14:30:00

Bu sayfadaki her örnek tarihleri açık bir biçim string'iyle yazdırır. Varsayılan ToString() geçerli kültürü izler (ABD'de 9/24/2026 2:30:00 PM, Almanya'da 24.09.2026 14:30:00), bu yüzden çıktısı makineye bağlıdır. Biçim kodları DateTime format sayfasındadır.

Geçersiz bir tarih istisna fırlatır: new DateTime(2026, 2, 30) bir ArgumentOutOfRangeException fırlatır; 13. ay ya da 24. saat de öyle.

Now, UtcNow ve Today

Saati üç statik property okur:

Örnek çıktı:

Now:    2026-09-24 18:20:41 (Local)
UtcNow: 2026-09-24 16:20:41 (Utc)
Today:  2026-09-24 00:00:00

Bu örnekte yerel saat dilimi UTC'den iki saat ileridedir, bu yüzden ilk iki satır iki saat farklıdır; UTC'ye ayarlı bir makinede aynıdırlar. Kind property'si bir değerin Local, Utc ya da Unspecified (kendiniz oluşturduğunuz tarihler için varsayılan) olduğunu kaydeder. Sakladığınız, log'a yazdığınız, karşılaştırdığınız ya da başka bir sisteme gönderdiğiniz her şey için DateTime.UtcNow kullanın: yaz saati başladığında ya da bittiğinde sıçramaz ve her sunucuda aynı anı ifade eder. Yerel saate yalnızca bir değeri bir insana gösterirken çevirin.

Kodun ne kadar sürdüğünü ölçmek için iki DateTime.Now değerini çıkarmak yerine System.Diagnostics.Stopwatch kullanın; çok daha ince çözünürlüğü vardır ve saat ayarlamalarından etkilenmez.

Zaman eklemek ve çıkarmak

AddDays, AddHours, AddMinutes, AddSeconds, AddMonths ve AddYears yeni bir DateTime döndürür. Geri gitmek için negatif bir sayı verin. DateTime değiştirilemez olduğu için sonuç atanmalıdır:

Çıktı:

2026-01-31
2026-02-03 09:00
2026-01-30 21:00
2026-02-28
2027-01-31
10:30
29
True

Gün mevcut olmadığında AddMonths ayın son gününe sabitlenir: 31 Ocak artı bir ay 3 Mart değil, 28 Şubat'tır (artık yılda 29). Bu yüzden iki kez bir ay eklemek ile iki ay eklemek farklı tarihler verebilir.

Tarihleri çıkarmak: TimeSpan

Bir DateTime'ı diğerinden çıkarmak bir TimeSpan verir:

Çıktı:

3.20:30:00
Days: 3, Hours: 20, Minutes: 30
TotalDays: 3.85
TotalHours: 92.5
TotalMinutes: 5550
Nights: 4

API'nin insanların en sık yanlış kullandığı kısmı budur. Days, Hours, Minutes ve Seconds sürenin bileşenleridir (3 gün, 20 saat, 30 dakika). TotalDays, TotalHours ve TotalMinutes ise tek bir birimde, double olarak tüm süredir. "Misafir kaç saat kaldı?" sorusunun cevabı Hours (20) değil TotalHours'tır (92.5).

Son satır ilgili bir noktayı gösterir: 3.85 gün geçti, ama misafir 4 gece kaldı. .Date kısımlarını karşılaştırmak takvim günlerini sayar; faturalama ve "kaç gün kaldı" göstergeleri genellikle bunu ister.

TimeSpan değerleri oluşturmak ve biçimlendirmek

Çıktı:

02:15:00
01:30:00
1.12:00:00
True
03:45:00
True
02:15
36h 0m
00:00:00

TimeSpan; +, -, karşılaştırmaları, Duration() (mutlak değer) ve Negate()'i destekler. @"hh\:mm" gibi özel biçimler literal karakterlerden önce ters eğik çizgi gerektirir ve oradaki hh yalnızca saat bileşenini (0 ile 23 arası) gösterir; bu yüzden bir günden uzun süreler için metni sondan ikinci satırdaki gibi TotalHours'tan oluşturun.

Tarihleri karşılaştırmak

DateTime; ==, !=, <, >, <= ve >='in yanı sıra CompareTo ve DateTime.Compare'ı destekler. Yalnızca tarihi karşılaştırıp saati yok saymak için .Date property'lerini karşılaştırın:

Çıktı:

True
True
1
True
2026-09-01

"Bu zaman damgası 30 Eylül'ün içinde mi?" sorusu için yukarıdaki gibi sonraki günün başlangıcıyla < kullanarak karşılaştırın. check <= end yazmak son günde gece yarısından sonraki her şeyi dışarıda bırakırdı, çünkü end 2026-09-30 00:00:00'dır.

Karşılaştırmalar Kind'a değil yalnızca tick'lere bakar: aynı yazdırılan bir Local değer ile bir Utc değer farklı anlar olsalar da eşit sayılır. Saklanan zamanları UTC'de tutmak için bir neden daha.

Haftanın günü ve haftanın başlangıcı

DayOfWeek, Sunday (0) ile Saturday (6) arasında bir enum'dur. Üzerindeki aritmetik hafta içi günleri ve hafta sınırlarını bulur:

Çıktı:

Thursday
4
Weekend: False
Week starts 2026-09-21 (Monday)
Next Friday: 2026-09-25
2026-09-01 to 2026-09-30

DayOfWeek.ToString()'in yazdırdığı gün adları her zaman İngilizcedir. Yerelleştirilmiş bir ad için tarihi "dddd" ve bir kültürle biçimlendirin.

String'lerden tarih parse etmek

Girdinin biçimini biliyorsanız CultureInfo.InvariantCulture ile ParseExact ya da TryParseExact kullanın. Biçim string'i biçimlendirmeyle aynı kodları kullanır:

Çıktı:

2026-09-24 00:00
2026-09-24 18:05
'2026-02-28' -> Saturday, February 28
'2026-02-30' -> invalid
'28.02.2026' -> invalid
'' -> invalid
2026-02-28
2026-09-24 10:00 Utc

Biçimsiz DateTime.Parse(text) geçerli kültürü kullanarak tahmin etmeye çalışır. "03/04/2026" ABD'deki bir makinede 4 Mart, İngiliz bir makinede 3 Nisan'dır ve dizüstü bilgisayarınızda parse edilen bir tarih bir sunucuda FormatException fırlatabilir. Parse'ı yerel bir kullanıcının yazdığı girdi için saklayın; dosyalar, API'ler ve veritabanları için invariant kültürle ParseExact kullanın. ParseExact metin eşleşmediğinde FormatException fırlatır; TryParseExact ise bunun yerine false döndürür.

Yaş hesaplamak

Doğum tarihlerini çıkarıp 365'e bölmek doğum günleri ve artık yıllar civarında yanlıştır. Yılları karşılaştırın, sonra bu yılın doğum günü henüz gelmediyse düzeltin:

Çıktı:

36
35
18
70 days to go

DateTimeOffset

Bir DateTime, belirsiz Kind bayrağının ötesinde hangi saat diliminde olduğunu kaydetmez. DateTimeOffset değeri UTC'ye göre farkıyla birlikte saklar, bu yüzden her zaman tek bir kesin anı tanımlar:

Çıktı:

2026-09-24 14:00 +02:00
2026-09-24 12:00
2026-09-24 12:30
00:30:00
21:00 +09:00

Zaman damgaları için (bir siparişin verildiği, bir mesajın gönderildiği an) DateTimeOffset (ya da UTC DateTime değerleri) kullanın. Veritabanları ve JSON serializer'ları onu iyi ele alır. Yaz saati kuralları olan adlandırılmış saat dilimleri arasında dönüşüm için TimeZoneInfo.ConvertTime kullanın; eski .NET sürümlerinde dilim ID'leri işletim sistemine göre değişir (Linux'ta "Europe/Paris", Windows'ta "Romance Standard Time"), .NET 6 ve sonrası ikisini de kabul eder.

DateOnly ve TimeOnly (.NET 6 ve sonrası)

Birçok değer saatsiz bir tarih (doğum günü, son teslim tarihi) ya da tarihsiz bir saattir (açılış saatleri). .NET 6 bunlar için iki tip ekledi:

// .NET 6 and later
DateOnly birthday = new DateOnly(1990, 9, 24);
DateOnly due = DateOnly.FromDateTime(DateTime.Today).AddDays(14);
int daysLeft = due.DayNumber - DateOnly.FromDateTime(DateTime.Today).DayNumber;

TimeOnly opens = new TimeOnly(9, 0);
TimeOnly closes = new TimeOnly(17, 30);
bool isOpen = TimeOnly.FromDateTime(DateTime.Now).IsBetween(opens, closes);

Bunlar, başıboş bir saatin ya da saat diliminin bir tarihi bir gün kaydırdığı bir hata sınıfını ortadan kaldırır. Eski kod ve .NET Framework ya da Unity'yi hedefleyen kod, saati gece yarısında bırakılmış DateTime kullanır.

Yaygın hatalar

  • AddDays'in sonucunu atmak. DateTime değiştirilemez; döndürülen değeri atayın.
  • TotalHours yerine Hours kullanmak. Bileşenler ile toplam süre farkı.
  • DateTime.Now saklamak. UTC saklayın ve gösterim için dönüştürün.
  • Log'larda, dosyalarda ya da testlerde biçimsiz ToString() çağırmak; çıktı makinenin kültürüne bağlı olur.
  • Makine verisinde DateTime.Parse ile parse etmek. ParseExact ve invariant kültürü kullanın.
  • Biçim string'lerinde mm ile MM'yi karıştırmak (dakikalar ve aylar). Bkz. DateTime format.

Sıkça Sorulan Sorular

DateTime.Now ile DateTime.UtcNow arasındaki fark nedir?

DateTime.Now, bilgisayarın yerel saat dilimindeki geçerli zamandır ve Kind değeri Local'dır. DateTime.UtcNow ise UTC'deki geçerli zamandır, Kind değeri Utc'dir ve saat dilimi dönüşümünü atladığı için daha hızlıdır. Zaman damgalarını UTC olarak saklayıp karşılaştırın, yerel saate yalnızca gösterim için çevirin.

C#'ta iki tarih arasındaki fark nasıl alınır?

Onları çıkarın: TimeSpan gap = end - start;. Ardından tüm süreyi double olarak almak için gap.TotalDays, gap.TotalHours ya da gap.TotalMinutes'ı, tam gün kısmı için gap.Days'i okuyun. Takvim ayları ya da yılları için yerleşik bir property yoktur, çünkü ayların uzunlukları farklıdır; yıl ve ay alanlarını kendiniz karşılaştırın.

TimeSpan.Hours ile TotalHours arasındaki fark nedir?

Hours, tam günler çıkarıldıktan sonra kalan, 0 ile 23 arasındaki saat bileşenidir. TotalHours ise tüm sürenin saat cinsinden double olarak ifadesidir. 1 gün 3 saatlik bir süre için Hours 3, TotalHours 27'dir. TotalHours kastedilirken Hours kullanmak çok yaygın bir hatadır.

C#'ta bir tarih string'i nasıl parse edilir?

Biçimi biliyorsanız DateTime.ParseExact(text, "yyyy-MM-dd", CultureInfo.InvariantCulture) kullanın ya da hatalı girdide FormatException yerine false almak için DateTime.TryParseExact kullanın. DateTime.Parse biçimi geçerli kültürden tahmin eder, bu yüzden 03/04/2026 ABD'de 4 Mart, Birleşik Krallık'ta 3 Nisan demektir.

AddDays neden DateTime'ımı değiştirmiyor?

DateTime değiştirilemez bir değer tipidir. AddDays, AddHours ve diğer metotlar yeni bir DateTime döndürür ve orijinali değiştirmez, bu yüzden sonucu atamanız gerekir: due = due.AddDays(7);.

DateTime yerine ne zaman DateTimeOffset kullanmalıyım?

Bir siparişin verildiği ya da bir log kaydının yazıldığı an gibi kesin bir anı tanımlaması gereken zaman damgaları için, özellikle veri sunucular ve saat dilimleri arasında taşınıyorsa DateTimeOffset kullanın. Değerle birlikte UTC'ye göre farkı da saklar. Yalnızca UTC zaman damgaları ve anlamlı bir saat dilimi olmayan tarihler için DateTime yeterlidir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA