CodeGym /Kurslar /C# SELF /Hesablamalar və tarix/vaxt üçün köməkçi class-lar

Hesablamalar və tarix/vaxt üçün köməkçi class-lar

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

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
Days
Günlərin tam sayı
Hours
Saat hissəsi
Minutes
Dəqiqə hissəsi
Seconds
Saniyə hissəsi
TotalDays
Vaxt günlərlə (ondalıq)
TotalHours
Vaxt saatlarla (ondalıq)
TotalMinutes
Vaxt dəqiqələrlə (ondalıq)
TotalSeconds
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)
AddDays(double)
Günlər (ondalıq dəstəyi, məsələn 1.5 gün)
AddMonths(int)
Aylar (ayın uzunluğunu avtomatik nəzərə alır)
AddYears(int)
İllər (sıçrayış illər də daxil)
AddHours(double)
Saatlar
AddMinutes(double)
Dəqiqələr
AddSeconds(double)
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
TimeSpan duration = d2 - d1
(d2 - d1).Days
Tarixə 2 həftə əlavə etmək
date.AddDays(14)
date.AddDays(14)
Yaşı hesablamaq
.Year
və ay/gün yoxlaması ilə formula
Yuxarıdakı bölməyə bax
Yalnız tarixi almaq/qoymaq
DateOnly
DateOnly.FromDateTime(DateTime.Now)
Yalnız vaxtı almaq/qoymaq
TimeOnly
TimeOnly.FromDateTime(DateTime.Now)
Tarixləri müqayisə etmək
<
,
>
,
==
,
.CompareTo()
operatorları
if (d1 < d2) ...
Başqa saat qurşağına keçirmək
DateTimeOffset + ToOffset
dto.ToOffset(TimeSpan.FromHours(3))
İldə həftənin nömrəsini bilmək
Calendar.GetWeekOfYear()
documentation-a bax
Həftənin gününü bilmək
date.DayOfWeek
İş günlərini saymaq
DayOfWeek
yoxlaması ilə dövr
Yuxarıdakı bölməyə bax
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Tarixlər arasındakı fərq
Tarixlər arasındakı fərq
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Həftənin günü
Həftənin günü
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Tarixlə işləmək
Tarix, vaxt və timezone-larla işləmək
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION