CodeGym /Kurslar /C# SELF /Tarix və vaxtın formatlanması və parse edilməsi

Tarix və vaxtın formatlanması və parse edilməsi

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

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
Tarix və vaxtın əsas formatlanması

Ə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ış
"d"
Qısa tarix 19.06.2025
"D"
Tam tarix 19 iyun 2025
"f"
Tam tarix + qısa vaxt 19 iyun 2025 17:30
"F"
Tam tarix + tam vaxt 19 iyun 2025 17:30:25
"g"
Qısa tarix və vaxt 19.06.2025 17:30
"G"
Qısa tarix + tam vaxt 19.06.2025 17:30:25
"t"
Qısa vaxt 17:30
"T"
Tam vaxt 17:30:25
"M"/"m"
Ay və gün 19 iyun
"Y"/"y"
İl və ay İyun 2025
"O"/"o"
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 DateOnlyTimeOnly 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

DateOnlyTimeOnly 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.

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Əsas tarix və vaxt formatlaşdırılması
Əsas tarix və vaxt formatlaşdırılması
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Sətirdən tarixin təhlükəsiz şəkildə parse edilməsi
Sətirdən tarixin təhlükəsiz şəkildə parse edilməsi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION