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: DateTime və DateTimeOffset. 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 | = 0001-01-01 00:00:00 |
| Maksimal tarix | = 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?
- Cari zaman nöqtəsi
DateTimeOffset now = DateTimeOffset.Now; // Lokal vaxt + offset DateTimeOffset utc = DateTimeOffset.UtcNow; // UTC (offset 0) - 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)); - 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ü | |
Yalnız tarix vacibdir, zona vacib deyil (adətən) |
| Login vaxtı | |
Dəqiq zaman və offset bilmək vacibdir |
| Məhsulun istifadə müddəti | |
Bitmə tarixi, zona vacib deyil |
| Logda event vaxtı | |
Həmişə offset ilə saxlamaq məsləhətdir |
GO TO FULL VERSION