CodeGym /Kurslar /C# SELF /Zamanla işləməyin əsas tipləri

Zamanla işləməyin əsas tipləri

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

1. DateTime tipi ilə tanışlıq

Tarix və zaman — istənilən biznes-məntiqin əsas daşlarından biridir, elə bir mövzudur ki, hətta ən sadə layihələrdə belə onu nəzərə almamaq olmaz. Tez-tez lazım olur ki, istifadəçi nə vaxt qeydiyyatdan keçib, məktub nə vaxt göndərilsin, reys cədvəlini düzgün işləmək, saat qurşaqları — hər yerdə tarixlər! Amma təcrübə göstərir ki, tarix və zamanla işləmək proqramlaşdırmada ən hiyləgər mövzulardan biridir. 😅

C# zamanla işləmək üçün iki əsas tip təklif edir: DateTimeDateTimeOffset. Qısa desək — biri sadə ssenarilər üçün, digəri isə saat qurşaqları və dəqiq zaman saxlamaq üçün.

DateTime nədir?

DateTime tipi — System namespace-də müəyyən olunmuş bir strukturdur. O, tarix və zamanı 100 nanosanisə dəqiqliyi ilə saxlamaq üçündür (1/10 milyard saniyə).

  • Dəyər tipi (struct), yəni dəyər üzrə kopyalanır.
  • Həm tarixi, həm də zamanı saxlayır.
  • Sadəcə tarix (2025-05-24) və ya tarix və zaman (2025-05-24 15:17:42) saxlamağa imkan verir.
  • Saat qurşaqları barədə "bilmir", əgər açıq şəkildə göstərilməyibsə.

2. DateTime yaradırıq

Bunun bir neçə yolu var, əsaslarını baxaq.

1. Cari tarix və zaman

DateTime now = DateTime.Now;           // Kompüterin lokal vaxtı
DateTime utcNow = DateTime.UtcNow;     // Qrinviç vaxtı (UTC)
  • Now — "sənin kompüterində necədirsə", Windows-un lokal saat qurşağı nəzərə alınır.
  • UtcNow — "universal", yəni dünya üzrə koordinasiya olunmuş vaxt. Məsələn, məlumat bazasında və ya bütün dünyada işləyən sistemlərdə vaxt saxlamaq üçün çox rahatdır.

2. Konstruktorlar

// İl, ay, gün
var date1 = new DateTime(2025, 5, 24);

// İl, ay, gün, saat, dəqiqə, saniyə
var date2 = new DateTime(2025, 5, 24, 12, 0, 0);

// İl, ay, gün, saat, dəqiqə, saniyə, millisaniyə
var date3 = new DateTime(2025, 5, 24, 12, 0, 0, 500);

Aylar sıfırdan başlamır! Yəni yanvar — 1, dekabr — 12.

3. Sətirdən parse etmək

Çox vaxt tarix sətir kimi gəlir! Məsələn, istifadəçi tarixi əl ilə daxil edir.

string userInput = "2025-05-24 18:30";
DateTime parsed = DateTime.Parse(userInput); // İstisna ata bilər!

Təhlükəsiz parse üçün — TryParse istifadə edirik:

string input = "2025-05-24 18:30";
if (DateTime.TryParse(input, out DateTime result))
{
    Console.WriteLine($"Uğurla çevrildi: {result}");
}
else
{
    Console.WriteLine("Sətiri tarixə çevirmək mümkün olmadı.");
}

4. "Zamansız" tarix almaq

DateTime today = DateTime.Today; // Cari gün, amma vaxt = 00:00:00

Tarix və zaman komponentlərini çıxarmaq

Bütün property-ləri tez əldə etmək olar:

var dt = new DateTime(2025, 5, 24, 15, 17, 42);

int year = dt.Year;         // 2025
int month = dt.Month;       // 5 (may)
int day = dt.Day;           // 24
int hour = dt.Hour;         // 15
int minute = dt.Minute;     // 17
int second = dt.Second;     // 42
DayOfWeek dow = dt.DayOfWeek; // Cümə

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

Tarixlərin toplanması və çıxılması

Zaman proqramlaşdırmada sürətlidir, ona görə də "deadline-a neçə saat qalıb" hesablamaq üçün class metodlarından istifadə edirik:

DateTime now = DateTime.Now;
DateTime tomorrow = now.AddDays(1); // Sabah
DateTime afterFiveHours = now.AddHours(5); // 5 saat sonra
DateTime inTenMinutes = now.AddMinutes(10); // 10 dəqiqə sonra

İki tarix arasındakı fərq: TimeSpan

İki tarix arasındakı fərq — ayrıca bir ölçüdür, tipi isə TimeSpan:

DateTime deadline = new DateTime(2026, 6, 1);
DateTime now = DateTime.Now;

TimeSpan untilDeadline = deadline - now;

Console.WriteLine($"Deadline-a qalan günlər: {untilDeadline.Days}");
Console.WriteLine($"Deadline-a qalan saatlar: {untilDeadline.TotalHours:N2}");

TimeSpan — bu "fərq"dir, "dəqiq tarix/zaman" deyil!

Tarixin gələcəkdə/keçmişdə olub-olmadığını yoxlamaq

if (deadline > now)
    Console.WriteLine("Deadline hələ qabaqdadır!");
else
    Console.WriteLine("Deadline artıq keçib! Tez işimizi təhvil veririk!");

4. Tarixlər necə saxlanılır

Tarixlərin toplanması və çıxılması rahat olsun deyə, proqramçılar bütün tarixləri bizim eranın əvvəlindən keçən saniyələrin sayı kimi saxlamağa qərar veriblər. Dəyərlərin diapazonu:

Xüsusiyyət Dəyər
Minimal tarix
DateTime.MinValue
= 0001-01-01 00:00:00
Maksimal tarix
DateTime.MaxValue
= 9999-12-31 23:59:59.9999999
Ölçü vahidi 1 tik = 100 nanosanisə

DateTime sadəcə saniyələrin sayını yox, xüsusi bir tarixdən — 1 yanvar 0001-ci ildən keçən "tik"lərin (ticks) sayını saxlayır (bəli, proqramçılar dinozavrları tanımır, onların təqvimi daha sərtdir). Bir tik = 100 nanosanisə.

5. DateTimeOffset tipi

Bəzən DateTime tipi kifayət etmir. Klassik bir hal: şirkət iki ölkədə işləyir, onların fərqli saat qurşaqları var, bütün görüşlər isə "mənim vaxtımla" planlaşdırılıb. Nə etməli?

DateTime kimi yazılmış zaman çox vaxt "abstrakt" olur: bu sadəcə rəqəmlər və tiklər toplusudur, sən açıq şəkildə hansı zonada olduğunu göstərməsən. Məsələn, əgər sən "2025-05-24 15:00" alırsansa, əmin ola bilməzsən — bu Nairobi vaxtıdı? Bağdad? Berlin? (əgər yay vaxtı da varsa — bərk tutun!).

Buna görə də, dəqiq zaman nöqtəsi ilə işləmək lazım olanda, sadəcə "təqvim tarixi" yox, ikinci tip — DateTimeOffset yaradılıb. DateTimeOffset yaratmaq üçün offset göstərmək olar (məsələn, Nairobi UTC-yə +3):


var localTime = new DateTimeOffset(2025, 5, 24, 15, 0, 0, TimeSpan.FromHours(3));

Əgər aşağıdakılar lazımdırsa, DateTimeOffset istifadə et:

  • Dəqiq zaman nöqtəsini bilmək lazımdır (məsələn, server vaxtına bağlı log eventləri üçün).
  • Proqram müxtəlif saat qurşaqlarında istifadəçilərlə işləyir.
  • Zonası ilə birlikdə vaxt saxlamaq/göndərmək lazımdır (məsələn, tranzaksiyalar, eventlər, cədvəllər üçün).

6. DateTimeOffset necə yaradılır?

  1. Cari zaman nöqtəsi
    DateTimeOffset now = DateTimeOffset.Now; // Lokal vaxt + offset
    DateTimeOffset utc = DateTimeOffset.UtcNow; // UTC (offset 0)
    
  2. Açıq şəkildə yaratmaq
    // İl, ay, gün, saat, dəqiqə, saniyə, offset (məsələn, +2 saat)
    DateTimeOffset custom = new DateTimeOffset(2025, 5, 24, 20, 0, 0, TimeSpan.FromHours(2));
    
  3. DateTime-dan konvertasiya
    DateTime dt = DateTime.Now;
    DateTimeOffset dto = new DateTimeOffset(dt); // Lokal offset avtomatik götürüləcək
    

Komponentləri çıxarmaq

DateTimeOffset dto = DateTimeOffset.Now;
var datePart = dto.Date;      // Yalnız tarix
var timePart = dto.TimeOfDay; // Yalnız zaman
var offset = dto.Offset;      // UTC-yə nisbətən offset, məsələn, 03:00:00

Saat qurşaqları arasında çevirmək

Offset magiyası:

// UTC-də tarixi alırıq
var now = DateTimeOffset.Now;
var utc = now.ToUniversalTime();
Console.WriteLine(utc); // Qrinviç vaxtı

// Başqa zonaya çeviririk
var berlinTime = utc.ToOffset(TimeSpan.FromHours(2));
Console.WriteLine(berlinTime); // Berlin üçün (CET +2)

7. DateTime nə vaxt, DateTimeOffset nə vaxt istifadə olunur?

Seçim fəlsəfəsi

Əgər söhbət sadə və lokal bir şeydən gedirsə — məsələn, ad günü, məqalənin dərc tarixi və ya sorğunun deadline-ı 15:00-a qədərdirsə, çox vaxt DateTime kifayət edir. Belə hallarda mütləq zaman vacib deyil, əsas odur ki, hadisə müəyyən gün və saatda baş verib, saat qurşağı önəmli deyil.

Amma konkret zaman nöqtəsini saat qurşağı ilə birlikdə saxlamaq lazımdırsa, məsələn, loglarda, tranzaksiyalarda və ya paylanmış sistemlərdə — DateTimeOffset daha yaxşıdır. O, vaxtı sistemlər arasında ötürəndə qarışıqlıq yaratmır, xüsusilə fərqli saat qurşaqlarında olduqda.

Ssenari Tip Niyə
Ad günü
DateTime
Yalnız tarix vacibdir, zona vacib deyil (adətən)
Login vaxtı
DateTimeOffset
Dəqiq zaman və offset bilmək vacibdir
Məhsulun istifadə müddəti
DateTime
Bitmə tarixi, zona vacib deyil
Logda event vaxtı
DateTimeOffset
Həmişə offset ilə saxlamaq məsləhətdir
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION