1. Tarix və vaxtla işləyərkən əsas tapşırıqlar
Tarix və vaxtla işləmək çox vaxt hətta təcrübəli developer-lərdə belə bir az (bəzən isə heç də az olmayan) panika hissi yaradır. Tarixləri müqayisə etmək, intervalları hesablamaq, gün/ay/il əlavə etmək və ya çıxmaq, yaş hesablamaq, həftənin gününü tapmaq və s. lazım olacaq.
Bütün bunlar — task tracker-lər və kalendarlar, abunəlik və ya üzvlük uçotu, maliyyə hesablamaları, statistik hesabatlar və əlbəttə, müsahibə tapşırıqları üçün tipik məsələlərdir (məsələn, "iki tarix arasında neçə iş günü var" kimi).
C# və .NET-də bu işlər üçün daxili class-lar və metodlar var. Ən əsası — əksər hesablamalar obyekt yönümlü, maksimum təhlükəsiz və başa düşülən API vasitəsilə edilir.
2. TimeSpan strukturu — vaxt intervallarını ölçürük
Hər şey TimeSpan strukturu ilə başlayır. Bu, "bir parça" vaxtdır: məsələn, 5 gün, 3 saat, 7 dəqiqə və 21 saniyə.
TimeSpan necə yaradılır?
İki tarixi "çıxmaq" olar, ya da birbaşa yaratmaq olar:
// İki tarix arasındakı fərq həmişə TimeSpan-dir!
DateTime start = new DateTime(2025, 5, 1, 7, 0, 0);
DateTime end = new DateTime(2025, 5, 2, 11, 30, 0);
TimeSpan duration = end - start; // Tam magiya!
Console.WriteLine(duration); // 1.04:30:00 (1 gün, 4 saat, 30 dəqiqə)
TimeSpan birbaşa konstruktor parametrləri ilə də yaradıla bilər:
TimeSpan span = new TimeSpan(2, 14, 18, 0); // 2 gün, 14 saat, 18 dəqiqə, 0 saniyə
Console.WriteLine(span); // 2.14:18:00
Alternativ yol — tez-tez daha oxunaqlı olan statik metodlarla yaratmaqdır:
TimeSpan fiveMinutes = TimeSpan.FromMinutes(5);
TimeSpan twoHours = TimeSpan.FromHours(2);
TimeSpan oneWeek = TimeSpan.FromDays(7);
TimeSpan-da hansı property-lər var?
| Property | Təsviri |
|---|---|
|
Günlərin tam sayı |
|
Saat hissəsi |
|
Dəqiqə hissəsi |
|
Saniyə hissəsi |
|
Vaxt günlərlə (ondalıq) |
|
Vaxt saatlarla (ondalıq) |
|
Vaxt dəqiqələrlə (ondalıq) |
|
Vaxt saniyələrlə (ondalıq) |
Console.WriteLine($"Günlər: {duration.Days}, Cəmi saatlar: {duration.TotalHours}");
TimeSpan-ı tarixə necə əlavə/çıxmaq olar?
DateTime now = DateTime.Now;
DateTime future = now.Add(duration); // duration-u now-a əlavə etdik
DateTime past = now.Subtract(TimeSpan.FromDays(10)); // 10 gün çıxıldı
Console.WriteLine(future);
Console.WriteLine(past);
3. Tarix kalkulyatoru: tarixlər arasındakı fərqi hesablamaq
Hər zaman lazım olacaq bir bacarıq. Məsələn, kimsə bilmək istəyir ki, tətilə nə qədər qalıb, başqası isə — pulsuz dövr nə vaxt bitir.
DateTime today = DateTime.Today;
DateTime vacation = new DateTime(2025, 8, 1);
TimeSpan untilVacation = vacation - today;
Console.WriteLine($"Tətilə {untilVacation.Days} gün qalıb!");
Diqqət et: əgər çıxmada yalnız "tarixlər" (vaxtsız) iştirak edirsə (DateTime.Date və ya DateTime.Today ilə), nəticə həmişə tam gün olur. Əgər ən azı bir tarixdə vaxt varsa, fərq ondalıq olur.
int days = (vacation - today).TotalDays; // Kompilyasiya xətası! TotalDays — double-dır
Tam ədəd lazımdırsa — .Days istifadə et və ya (int)TotalDays ilə cast et.
4. Vaxt əlavə etmək və çıxmaq: AddDays, AddMonths, AddHours və s.
C#-da hər ayda neçə gün olduğunu, sıçrayış illəri və s. əl ilə hesablamağa ehtiyac yoxdur. Sadəcə istifadə et:
DateTime orderDate = new DateTime(2024, 4, 20);
DateTime deliveryDate = orderDate.AddDays(14); // 2 həftə sonra
Console.WriteLine($"Məhsul {deliveryDate.ToShortDateString()} tarixində çatdırılacaq");
| Metod | Nə əlavə edir (və ya mənfi ədədlə çıxır) |
|---|---|
|
Günlər (ondalıq dəstəyi, məsələn 1.5 gün) |
|
Aylar (ayın uzunluğunu avtomatik nəzərə alır) |
|
İllər (sıçrayış illər də daxil) |
|
Saatlar |
|
Dəqiqələr |
|
Saniyələr |
DateTime birthday = new DateTime(2000, 2, 29);
DateTime nextYear = birthday.AddYears(1); // 2001-02-28 (29 yox, çünki 2001 sıçrayış ili deyil)
Console.WriteLine(nextYear.ToShortDateString()); // 28.02.2001
Unutma: bütün metodlar yeni tarix nümunəsi qaytarır, orijinal tarix dəyişmir!
var dt = DateTime.Now;
dt.AddDays(5); // Bu dt-ni DƏYİŞMİR!
dt = dt.AddDays(5); // İndi dəyişdi
5. Hesablamalar üçün köməkçi metodlar
Həftənin gününü hesablamaq
Əksər hallarda .DayOfWeek property-sindən istifadə etmək olar:
DateTime examDate = new DateTime(2025, 6, 19);
DayOfWeek day = examDate.DayOfWeek;
Console.WriteLine(day); // Wednesday
Tam ədədə çevirmək olar:
int number = (int)day; // Sunday == 0, Monday == 1 və s.
"Bu gün", "dünən", "sabah" yoxlaması
Ən sadə müqayisələr:
DateTime date = new DateTime(2025, 6, 18);
if (date.Date == DateTime.Today)
Console.WriteLine("Bu gün!");
else if (date.Date == DateTime.Today.AddDays(-1))
Console.WriteLine("Dünən!");
else if (date.Date == DateTime.Today.AddDays(1))
Console.WriteLine("Sabah!");
Yaşı hesablamaq
Ən çox rast gəlinən tapşırıqlardan biri — insanın yaşını düzgün hesablamaqdır. Sadəcə illəri çıxmaq həmişə düzgün işləmir:
public static int CalculateAge(DateTime birthDate, DateTime currentDate)
{
int age = currentDate.Year - birthDate.Year;
// Əgər bu il ad günü hələ gəlməyibsə
if (currentDate.Month < birthDate.Month ||
(currentDate.Month == birthDate.Month && currentDate.Day < birthDate.Day))
{
age--;
}
return age;
}
// İstifadə
DateTime birth = new DateTime(1990, 8, 15);
DateTime today = DateTime.Today;
int age = CalculateAge(birth, today);
Console.WriteLine($"Yaş: {age} il");
İş günləri ilə işləmək
Çox vaxt tarixlər arasında iş günlərinin sayını hesablamaq lazımdır, yəni həftəsonlarını çıxmaq:
public static int CountWorkingDays(DateTime startDate, DateTime endDate)
{
int workingDays = 0;
DateTime current = startDate;
while (current <= endDate)
{
if (current.DayOfWeek != DayOfWeek.Saturday &&
current.DayOfWeek != DayOfWeek.Sunday)
{
workingDays++;
}
current = current.AddDays(1);
}
return workingDays;
}
6. Əsas class-lar necə əlaqəlidir
graph TD
A(DateTime) --çıxmaq--> B(TimeSpan)
A2(DateTime) --AddDays, AddMonths--> A
A --ToLocalTime/ToUniversalTime--> C(DateTimeOffset)
D(DateOnly) --ToDateTime--> A
E(TimeOnly) --ToTimeSpan--> B
A --DayOfWeek, Day, Month, Year--> F(Rəqəm property-lər)
B(TimeSpan) --TotalDays, TotalHours, ...--> G(Müddət property-ləri)
7. Tez "bələdçi": əgər ... etmək lazımdırsa
| Tapşırıq | Nə istifadə etməli | Nümunə |
|---|---|---|
| Tarixlər arasındakı fərqi bilmək | |
|
| Tarixə 2 həftə əlavə etmək | |
|
| Yaşı hesablamaq | və ay/gün yoxlaması ilə formula |
Yuxarıdakı bölməyə bax |
| Yalnız tarixi almaq/qoymaq | |
|
| Yalnız vaxtı almaq/qoymaq | |
|
| Tarixləri müqayisə etmək | , , , operatorları |
|
| Başqa saat qurşağına keçirmək | |
|
| İldə həftənin nömrəsini bilmək | |
documentation-a bax |
| Həftənin gününü bilmək | |
|
| İş günlərini saymaq | yoxlaması ilə dövr |
Yuxarıdakı bölməyə bax |
GO TO FULL VERSION