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 DateOnly və TimeOnly tipləri var və bu qarışıqlıqdan qurtulursan.
Yeni faydalı tiplər DateOnly və TimeOnly
- 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? |
|---|---|---|---|---|
|
✅ | ✅ | 🚫 | Demək olar ki, hər şey üçün (amma həmişə rahat və təhlükəsiz deyil) |
|
✅ | ✅ | ✅ | Həm zaman nöqtəsi, həm də saat qurşağı lazım olanda |
|
✅ | 🚫 | 🚫 | Ad günləri, vaxtsız tarixlər |
|
🚫 | ✅ | 🚫 | İş 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);
Ə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, Day — DateTime-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, TimeOnly və DateTime 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() və TimeOnly.Parse() istifadə et — onlar "kəsilmiş" dəyərlərlə necə işləməyi bilirlər.
- Vacibdir: DateOnly və TimeOnly 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.
GO TO FULL VERSION