CodeGym /Kurslar /C# SELF /Faydalı tiplər: DateOnly və TimeOnly

Faydalı tiplər: DateOnly və TimeOnly

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Əvvəllər C#-da yalnız tarix və ya yalnız vaxt üçün ayrıca tip yox idi. Yəni, əgər sənə sadəcə tarix saxlamaq lazım idisə — məsələn, ad günü — DateTime istifadə etməli idin və "default vaxt" əlavə etməli idin. Yalnız tarixi DateTime ilə saxlamağın köhnə üsulu:


DateTime birthday = new DateTime(1985, 4, 20); // 20 aprel 1985-ci il, 00:00:00

Amma bu rahat deyil. Sən sadəcə tarix istəyirsən, amma əlavə olaraq vaxt da gəlir — hətta sıfır olsa belə. Bu çaşdırıcı ola bilər: məsələn, tarixləri müqayisə edəndə proqram həm vaxtı, həm də tarixi nəzərə ala bilər və gözlənilməz nəticələr alarsan.

Eyni vəziyyət əksinə də olur: əgər sən yalnız vaxtla işləyirsənsə (məsələn, iş qrafiki 08:00-dan 17:00-dək), yenə də hansısa tarixi "uydurmalı" olurdun, halbuki o, ümumiyyətlə vacib deyil.

İndi .NET-də xüsusi DateOnlyTimeOnly tipləri var və bu qarışıqlıqdan qurtulursan.

Yeni faydalı tiplər DateOnlyTimeOnly

  • DateOnly — yalnız təqvim tarixi, vaxt və saat qurşağı haqqında heç bir məlumat yoxdur.
  • TimeOnly — yalnız günün vaxtı, il, ay, gün və yenə də saat qurşağı olmadan.

Zaman tiplərinin müqayisə cədvəli

Tip Tarix Vaxt Saat qurşağı Nə üçün istifadə olunur?
DateTime
🚫 Demək olar ki, hər şey üçün (amma həmişə rahat və təhlükəsiz deyil)
DateTimeOffset
Həm zaman nöqtəsi, həm də saat qurşağı lazım olanda
DateOnly
🚫 🚫 Ad günləri, vaxtsız tarixlər
TimeOnly
🚫 🚫 İş saatları, cədvəllər, gün ərzində intervallar

2. DateOnly ilə işləmək

Təyin və yaradılması

DateOnly obyektini yaratmaq — yeni vərdişə başlamaq kimi: asan və tez! Məsələn:

// İl, ay, gün
DateOnly birthday = new DateOnly(1985, 4, 20);
DateOnly ilə ad gününün yaradılması

Əgər artıq DateTime obyektin varsa, DateOnly.FromDateTime istifadə edə bilərsən:

DateTime now = DateTime.Now;
DateOnly today = DateOnly.FromDateTime(now);
// indi today yalnız tarixi saxlayır, vaxt atılıb

Əsas xüsusiyyətlər və metodlar

  • Year, Month, DayDateTime-da olduğu kimi tanışdır.
  • .ToString() — tarixi formatlaşdırır, öz formatını verə bilərsən.
Console.WriteLine($"Ad günü: {birthday.Year} il, {birthday.Month} ay, {birthday.Day} gün.");

Console.WriteLine(today.ToString("dd.MM.yyyy")); // Məsələn, 30.07.2024

Tarix arifmetikası

Asanlıqla gün/ay/il əlavə edə bilərsən:

DateOnly tomorrow = today.AddDays(1);
DateOnly nextMonth = today.AddMonths(1);

Əsas tətbiqində yalnız tarixi saxlayan DateTime tiplərini DateOnly ilə əvəz etməyə çalış — sən artıq müasir .NET-ə bir addım yaxınsan!

Tarixlərin müqayisəsi

Müqayisə <, >, == ilə işləyir:

if (birthday < today)
    Console.WriteLine("Ad günü bu il artıq olub və ya çoxdan keçib :)");

Artıq əlavə millisekund və dəqiqələrlə bağlı səhvlər olmayacaq.

Bugünkü tarixi almaq

DateOnly currentDate = DateOnly.FromDateTime(DateTime.Now);

3. TimeOnly ilə işləmək

İndi isə tarixsiz vaxtla məşğul olaq — axı hansı proqramçı nahar cədvəlləri ilə rastlaşmayıb ki?

TimeOnly yaradılması

TimeOnly startWork = new TimeOnly(9, 0);    // 09:00
TimeOnly endWork = new TimeOnly(17, 30);    // 17:30

Yalnız saat, dəqiqə, saniyə ala bilərik:

Console.WriteLine($"İş günü: {startWork.Hour}:{startWork.Minute:D2}-dan {endWork.Hour}:{endWork.Minute:D2}-dək");

DateTime-dan vaxt almaq

DateTime now = DateTime.Now;
TimeOnly currentTime = TimeOnly.FromDateTime(now);
Console.WriteLine($"İndi {currentTime}");

Vaxt arifmetikası

TimeOnly breakStart = startWork.AddHours(4); // 4 saatdan sonra fasilə, yəni 13:00
TimeOnly breakEnd = breakStart.AddMinutes(30); // 30 dəqiqə nahar

Müqayisələr və yoxlamalar

if (currentTime >= startWork && currentTime <= endWork)
    Console.WriteLine("İş vaxtıdır :)");
else
    Console.WriteLine("Dincəlmək olar.");

4. Digər tiplərlə qarşılıqlı əlaqə

DateOnly, TimeOnlyDateTime arasında çevirmə

Bəzən yenidən DateTime əldə etmək lazım olur (məsələn, köhnə bazada saxlamaq və ya uyğunluq üçün):


DateOnly datePart = new DateOnly(2024, 7, 30);
TimeOnly timePart = new TimeOnly(14, 15);
DateTime datetime = datePart.ToDateTime(timePart); // 2024-07-30 14:15:00

Və əksinə:

DateTime dt = DateTime.Now;
DateOnly justDate = DateOnly.FromDateTime(dt);
TimeOnly justTime = TimeOnly.FromDateTime(dt);

Vacib xüsusiyyətlər və tipik səhvlər

  • Əgər yalnız tarix və ya yalnız vaxtı köhnə metodlarla, məsələn, DateTime.Parse() ilə parse etməyə çalışsan, çox güman ki, səhv alacaqsan və ya gözlədiyin nəticəni görməyəcəksən. Belə hallar üçün xüsusi metodlar var: DateOnly.Parse()TimeOnly.Parse() istifadə et — onlar "kəsilmiş" dəyərlərlə necə işləməyi bilirlər.
  • Vacibdir: DateOnlyTimeOnly heç bir saat qurşağı haqqında məlumat saxlamır. Bu, sadəcə tarix və ya sadəcə vaxtdır — saat qurşağı ilə əlaqəsi yoxdur. Əgər saat qurşağı lazımdırsa, bu məlumatı ayrıca saxla.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION