1. Tarixlərin formatlanması
Əgər səncə 2025-06-19T17:30:00 çıxışı olduqca cool görünürsə, bu formatı nənənə və ya mühasibə göstərməyə çalış. Çox güman ki, onlar daha sadə bir şey istəyəcəklər: 19.06.2025 17:30. Amma ingilisdilli kolleqalar 06/19/2025 5:30 PM gözləyirlər. Devops-lar və maşınlar isə ümumiyyətlə 2025-06-19T17:30:00Z formatını sevirlər. Yəni proqramın yaddaşında bir DateTime ekranda onlarla fərqli formatda göstərilə bilər.
Əks tapşırıq da klassikdir: istifadəçi input sahəsinə tarix daxil edir ("19.06.2025"), biz isə onu C# obyektinə çevirməliyik və qarışdırmamalıyıq ki, gün hansıdır, ay hansıdır. Avtomatlaşdırma, inteqrasiyalar, hesabatlar — hər yerdə mətn tarixlərinin düzgün interpretasiyası lazımdır.
Əsas formatlama
C# tarix/vaxt obyektini (DateTime, DateOnly, TimeOnly, DateTimeOffset) string-ə çevirməyə imkan verir .ToString() metodu ilə:
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString()); // Çıxış: 19.06.2025 17:30:25
Əgər .ToString() parametrsiz çağırılsa — sistemin cari mədəniyyətinə uyğun format istifadə olunacaq (məsələn, alman Windows bir format göstərəcək, amerikan başqa).
Standart format sətirləri
Çıxış formatını açıq şəkildə göstərmək olar, bunun üçün tarix və vaxt üçün standart format sətirlərindən istifadə olunur:
| Format | Təsvir | Nümunə çıxış |
|---|---|---|
|
Qısa tarix | 19.06.2025 |
|
Tam tarix | 19 iyun 2025 |
|
Tam tarix + qısa vaxt | 19 iyun 2025 17:30 |
|
Tam tarix + tam vaxt | 19 iyun 2025 17:30:25 |
|
Qısa tarix və vaxt | 19.06.2025 17:30 |
|
Qısa tarix + tam vaxt | 19.06.2025 17:30:25 |
|
Qısa vaxt | 17:30 |
|
Tam vaxt | 17:30:25 |
|
Ay və gün | 19 iyun |
|
İl və ay | İyun 2025 |
|
ISO 8601 (round tripper) | 2025-06-19T17:30:25.0000000 |
Console.WriteLine(now.ToString("d")); // 19.06.2025
Console.WriteLine(now.ToString("F")); // 19 iyun 2025 17:30:25
Console.WriteLine(now.ToString("O")); // 2025-06-19T17:30:25.0000000
Kastom (istifadəçi) şablonları
Daha spesifik formatlar lazımdırsa, öz şablonlarından istifadə edə bilərsən:
| Simvol | Məna |
|---|---|
| yyyy | İl, 4 rəqəm |
| yy | İl, 2 rəqəm |
| MM | Ay, 2 rəqəm |
| MMMM | Ayın adı |
| dd | Gün, 2 rəqəm |
| d | Gün, 1-2 rəqəm |
| HH | Saat (24s) |
| mm | Dəqiqə |
| ss | Saniyə |
| tt | AM/PM |
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm")); // 2025-06-19 17:30
Console.WriteLine(now.ToString("dd.MM.yyyy")); // 19.06.2025
Console.WriteLine(now.ToString("dddd, MMMM d")); // çərşənbə, iyun 19
Formatlamada mədəniyyət fərqləri
Əgər başqa ölkə və ya dil stilində nəticə almaq istəyirsənsə, ToString(string, IFormatProvider) overload-undan istifadə et:
var enUS = new System.Globalization.CultureInfo("en-US");
Console.WriteLine(now.ToString("D", enUS)); // June 19, 2025
- Əgər "MM/dd/yyyy" kimi şablonu sərt şəkildə versən, mədəniyyətdən asılı olmayaraq "06/19/2025" alacaqsan.
- Amma yalnız "d" və ya "D" istifadə etsən — format mədəniyyətdən asılı olacaq!
Formatlama ilə işləyərkən vacib məqamlar
Tarix formatlaması ilə işləyərkən standart və kastom formatlar arasındakı fərqi başa düşmək vacibdir. Standart formatlar ("d", "F", "G" kimi) avtomatik olaraq sistemin mədəniyyətinə uyğunlaşır, bu istifadəçi interfeysi üçün rahatdır, amma sistemlər arasında data mübadiləsində problem yarada bilər. Kastom formatlar isə çıxışa tam nəzarət verir, amma daha detallı tənzimləmə tələb edir.
Xüsusi diqqət "O" (və ya "o") formatına verilməlidir — bu, "round-trip" format adlanır və zəmanət verir ki, tarix string-ə və əksinə çevriləndə tam eyni qalacaq. Bu format xüsusilə data serializasiyası və şəbəkə üzərindən ötürüləndə vacibdir.
2. Tarix və vaxtın parse edilməsi: string-dən obyektə necə keçmək olar
Ən sadə parse: DateTime.Parse
DateTime.Parse — string-dəki tarixi sistemin mədəniyyətini nəzərə alaraq tanımağa çalışan metoddur.
string input = "19.06.2025";
DateTime parsed = DateTime.Parse(input);
Console.WriteLine(parsed); // 19.06.2025 00:00:00
Əgər string səhvdirsə — proqram exception ilə çökəcək (heç kim sığortalanmayıb!).
Mədəniyyəti göstərmək
string input = "06/19/2025";
var enUS = new System.Globalization.CultureInfo("en-US");
DateTime dt = DateTime.Parse(input, enUS);
Console.WriteLine(dt); // 19.06.2025 00:00:00
Təhlükəsiz parse: TryParse
string input = "yanlış tarix";
bool ok = DateTime.TryParse(input, out DateTime safeDate);
if (!ok)
Console.WriteLine("Xəta: tarixi tanımaq mümkün olmadı!");
Sərt format göstərmək: ParseExact və TryParseExact
var culture = System.Globalization.CultureInfo.InvariantCulture;
string dateStr = "2025-06-19";
DateTime d = DateTime.ParseExact(dateStr, "yyyy-MM-dd", culture);
Console.WriteLine(d); // 19.06.2025 00:00:00
bool parsedOk = DateTime.TryParseExact(
"19.06.2025",
"dd.MM.yyyy",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out DateTime myDate);
Populyar formatlar cədvəli
| String | Format | Son obyekt |
|---|---|---|
| "2025-06-19" | "yyyy-MM-dd" | 19 iyun 2025 |
| "19.06.2025" | "dd.MM.yyyy" | 19 iyun 2025 |
| "06/19/2025" | "MM/dd/yyyy" | 19 iyun 2025 |
| "2025-06-19T14:15:16" | "s" | 19 iyun 2025 14:15:16 |
DateTimeStyles ilə işləmək
Parse zamanı əlavə olaraq DateTimeStyles parametri ilə davranışı tənzimləyə bilərsən. Bu enum parser-ə input-u necə interpretasiya etməli olduğunu göstərir. Məsələn, DateTimeStyles.AssumeUniversal parser-ə deyir ki, əgər offset göstərilməyibsə, vaxtı UTC kimi qəbul etsin. DateTimeStyles.AllowWhiteSpaces isə string-də artıq boşluqları görməməzliyə vurmağa imkan verir. Bu ayarlar xüsusilə xarici mənbələrdən data gələndə faydalıdır, çünki format həmişə proqnozlaşdırıla bilmir.
3. DateOnly, TimeOnly ilə formatlama və parse
Yeni DateOnly və TimeOnly tipləri indi tez-tez əlavə detallar olmadan tarix/vaxt saxlamaq üçün istifadə olunur.
Formatlama
DateOnly birthday = new DateOnly(2000, 6, 19);
Console.WriteLine(birthday.ToString("dd MMMM yyyy")); // 19 iyun 2000
Parse
var d = DateOnly.ParseExact("19.06.2000", "dd.MM.yyyy");
Console.WriteLine(d.Day); // 19
TimeOnly üçün də metodlar eyni işləyir (sadəcə şablonlar yalnız saat/dəqiqə/saniyə üçündür):
TimeOnly t = TimeOnly.ParseExact("23:59", "HH:mm");
Console.WriteLine(t.Hour); // 23
DateOnly və TimeOnly üstünlükləri
DateOnly və TimeOnly istifadə etmək DateTime əvəzinə bir neçə vacib üstünlük verir. Birincisi, semantik aydınlıq — əgər sənə yalnız tarix lazımdırsa (məsələn, doğum tarixi), DateOnly bunu açıq göstərir. İkincisi, bu, DateTime ilə işləyərkən yarana biləcək saat qurşağı problemlərindən qaçmağa kömək edir. Üçüncüsü, bu tiplər yaddaşda və verilənlər bazasında daha az yer tutur.
Saat qurşaqları ilə formatlama və parse
Əgər vaxtı offset ilə saxlayırsansa — DateTimeOffset istifadə et. Bu, xüsusilə beynəlxalq, paylanmış sistemlər üçün vacibdir. Bütün formatlama və parse metodları eynidir, sadəcə indi offset-i də idarə edə bilərsən:
DateTimeOffset meeting = new DateTimeOffset(2025, 6, 19, 17, 30, 0, TimeSpan.FromHours(3));
Console.WriteLine(meeting.ToString("o")); // 2025-06-19T17:30:00.0000000+03:00
string input = "2025-06-19T17:30:00+03:00";
var parsedOffset = DateTimeOffset.Parse(input);
Console.WriteLine(parsedOffset.Offset); // 03:00:00
4. Praktik qeydlər və tipik səhvlər
Tələlərdən biri — beynəlxalq formatlarda parse zamanı "gün" və "ay"ı qarışdırmaqdır. Məsələn, "01/02/2025" ABŞ-da 2 yanvar deməkdir, amma Avropanın çoxunda 1 fevral (sürpriz!).
Həmçinin tez-tez mədəniyyətin təsirini unudurlar: əgər tətbiq Almaniyada serverdə işləyir, amma istifadəçilər müxtəlif ölkələrdədirsə, bazadan gələn tarix hər serverdə fərqli interpretasiya oluna bilər.
Tez-tez rast gəlinən səhv — loglar və data mübadiləsi üçün .ToString() istifadə etmək, amma mədəniyyət/format göstərməmək: nəticə başqa OS-ə keçəndə və ya tətbiq fərqli Windows istifadəçisi altında işləyəndə dəyişə bilər.
Tarixlərlə işləmək üçün tövsiyələr
- Daxili saxlama və data mübadiləsi üçün həmişə invariant mədəniyyət (CultureInfo.InvariantCulture) və ya açıq göstərilmiş formatlardan istifadə et.
- İstifadəçi interfeysi üçün istifadəçi mədəniyyətini tətbiq et və ya ona istədiyi formatı seçmək imkanı ver.
- API və verilənlər bazası ilə işləyərkən beynəlxalq standart olan ISO 8601 formatına üstünlük ver.
- Həmişə input-u yoxla: tarixin mövcudluğunu, diapazonunu və məntiqliliyini yoxla.
Müxtəlif data mənbələri ilə işləmək
Xarici sistemlərlə inteqrasiya zamanı tez-tez müxtəlif formatlarda tarixlərlə işləmək lazım olur. Bəzi sistemlər tarixləri Unix timestamp (1970-ci ilin 1 yanvarından bəri saniyə sayı) kimi göndərir, digərləri isə milli formatlarda string şəklində. Əvvəlcədən data mübadiləsi formatı barədə razılaşmaq və parse-in düzgünlüyünü həmişə yoxlamaq vacibdir.
Həmçinin yadda saxlamaq lazımdır ki, bəzi formatlar qeyri-müəyyən ola bilər. Məsələn, "12/13/2025" aydın şəkildə 13 dekabr 2025 deməkdir, amma "12/11/2025" həm 12 noyabr, həm də 11 dekabr ola bilər, mədəniyyətdən asılı olaraq. Belə hallarda daha az qeyri-müəyyən formatlardan istifadə etmək və ya parse zamanı mədəniyyəti açıq göstərmək daha yaxşıdır.
GO TO FULL VERSION