CodeGym /Kurslar /JAVA 25 SELF /Tarixlərin formatlaşdırılması və parsinqi: DateTimeFormat...

Tarixlərin formatlaşdırılması və parsinqi: DateTimeFormatter

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. DateTimeFormatter: bu nədir və nə üçün lazımdır

Real proqramlarda tarixlər nadir hallarda yalnız kod daxilində qalır. Adətən bunları etmək lazımdır:

  • Sətirə çevirmək — konsola, ekrana və ya fayla çıxış üçün (məsələn, "01.06.2025 14:30").
  • Sətirdən pars etmək, yəni istifadəçinin daxil etdiyi və ya fayldan gələn sətiri yenidən tarix/vaxt obyektinə çevirmək.

Bunun üçün Java-da güclü və rahat alət var — java.time.format.DateTimeFormatter sinfi.

Demək olar ki, DateTimeFormatter — zaman obyektləri (LocalDate, LocalDateTime, ZonedDateTime, Instant və s.) ilə sətirlər arasında tərcüməçidir. O, bunları bacarır:

  • Tarix/vaxt obyektlərini lazım olan formatda sətirlərə çevirmək (format — formatlaşdırma).
  • Sətirləri tarix/vaxt obyektlərinə çevirmək (parse — parsinq).

2. Standart formatlaşdırıcılar: sürətli və sadə

Java populyar ISO formatlarını (tarix və vaxt üçün beynəlxalq standartlar) əhatə edən standart formatlaşdırıcılar toplusunu bizim üçün qabaqcadan hazırlayıb.

Onlardan bəziləri:

Formatlaşdırıcı Sətir nümunəsi Təsvir
DateTimeFormatter.ISO_LOCAL_DATE
2025-06-01 Yalnız tarix (il-ay-gün)
DateTimeFormatter.ISO_LOCAL_TIME
14:30:00 Yalnız vaxt (saat:dəqiqə:san)
DateTimeFormatter.ISO_LOCAL_DATE_TIME
2025-06-01T14:30:00 Saat qurşağı olmadan tarix və vaxt
DateTimeFormatter.ISO_ZONED_DATE_TIME
2025-06-01T14:30:00+03:00[Europe/Minsk] Tarix, vaxt və saat qurşağı

Standart formatlaşdırıcının istifadəsinə nümunə

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FormatterDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        // Tarixi sətirə formatlaşdırırıq
        String text = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(text); // Məsələn, 2025-06-01

        // Sətiri yenidən tarixə pars edirik
        LocalDate parsed = LocalDate.parse("2025-06-01", DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(parsed); // 2025-06-01
    }
}

Analoqiya

Əgər Java bir qəhvəxana olsaydı, standart formatlaşdırıcılar “americano”, “latte” və “espresso” olardı. Sürətli, standart — amma bəzən nəsə daha xüsusi istənilir!

3. İstifadəçi şablonları: DateTimeFormatter.ofPattern

Bəzən standart formatlar kifayət etmir. Məsələn, tarixi "01.06.2025 14:30" kimi çıxarmaq lazımdır, "2025-06-01T14:30:00" kimi yox. Bunun üçün DateTimeFormatter.ofPattern(String pattern) metodu ilə öz şablonumuzu yarada bilərik.

Şablonların sintaksisi

Şablonda xüsusi hərflər istifadə olunur:

  • y — il (yyyy2025)
  • M — ay (MM06)
  • d — gün (dd01)
  • H — saat (24-saat formatı, HH14)
  • m — dəqiqələr (mm30)
  • s — saniyələr (ss00)

Şablon nümunələri

Şablon Nəticə nümunəsi
"dd.MM.yyyy"
01.06.2025
"yyyy/MM/dd"
2025/06/01
"dd.MM.yyyy HH:mm"
01.06.2025 14:30
"yyyy-MM-dd HH:mm:ss"
2025-06-01 14:30:00
"d MMMM yyyy"
1 iyun 2025 (rus lokalında)

Nümunə: tarix və vaxtın formatlaşdırılması

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CustomFormatDemo {
    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2025, 6, 1, 14, 30);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        String text = dt.format(formatter);
        System.out.println(text); // 01.06.2025 14:30
    }
}

Nümunə: sətirin tarixə pars edilməsi

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ParseDemo {
    public static void main(String[] args) {
        String input = "01.06.2025 14:30";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        LocalDateTime dt = LocalDateTime.parse(input, formatter);
        System.out.println(dt); // 2025-06-01T14:30
    }
}

Diqqət: şablon sətirə tam uyğun olmalıdır! Əgər sətirdə saniyələr varsa — şablona :ss əlavə edin.

4. Formatlaşdırma: tarix/vaxtı sətirə çevirmək

Ümumi sxem

  1. Lazımi obyekti yaradın (LocalDate, LocalDateTime, ZonedDateTime və s.).
  2. Lazımi formatlaşdırıcını yaradın və ya seçin.
  3. Obyektdə format(DateTimeFormatter) metodunu çağırın, sətir alın.

Nümunə: tarixi fərqli formatlarda çıxarırıq

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class MultiFormatDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 6, 1);

        // Standart ISO
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2025-06-01

        // Fərdi format
        DateTimeFormatter rusFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        System.out.println(date.format(rusFormat)); // 01.06.2025

        // İngilis üslubu
        DateTimeFormatter usFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println(date.format(usFormat)); // 06/01/2025
    }
}

Vaxtın formatlaşdırılması

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class TimeFormatDemo {
    public static void main(String[] args) {
        LocalTime time = LocalTime.of(14, 30, 5);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println(time.format(formatter)); // 14:30:05
    }
}

5. Parsinq: sətiri tarix/vaxta çevirmək

Ümumi sxem

  1. Sətiri alın (məsələn, istifadəçidən).
  2. Sətirlə eyni şablonu olan formatlaşdırıcı yaradın.
  3. parse() statik metodunu və ya formatlaşdırıcı obyektinin parse() metodunu çağırın.

Nümunə: tarixin pars edilməsi

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class ParseDateDemo {
    public static void main(String[] args) {
        String input = "01.06.2025";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        LocalDate date = LocalDate.parse(input, formatter);
        System.out.println(date); // 2025-06-01
    }
}

Nümunə: tarix və vaxtın pars edilməsi

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ParseDateTimeDemo {
    public static void main(String[] args) {
        String input = "01.06.2025 14:30";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        LocalDateTime dateTime = LocalDateTime.parse(input, formatter);
        System.out.println(dateTime); // 2025-06-01T14:30
    }
}

6. Parsinq səhvlərinin emalı

Parsinq hiyləgər bir şeydir. Sətir şablona uyğun gəlmirsə, Java DateTimeParseException istisnasını atacaq. Bu adi situasiyadır, məsələn, istifadəçi tarixi səhv daxil edibsə.

Nümunə: parsinq zamanı səhvlərin emalı

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class ParseErrorDemo {
    public static void main(String[] args) {
        String input = "32.13.2025"; // Yanlış tarix
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        try {
            LocalDate date = LocalDate.parse(input, formatter);
            System.out.println(date);
        } catch (DateTimeParseException ex) {
            System.out.println("Parsinq xətası: " + ex.getMessage());
        }
    }
}

Vacibdir: istifadəçi girişi ilə işləyirsinizsə, belə səhvləri həmişə emal edin!

7. Təcrübə: tarixlərin istifadəçi üçün çevrilməsi

Tutaq ki, tədris tətbiqimizdə belə bir tapşırıq var: istifadəçi doğum tarixini "dd.MM.yyyy" formatında daxil edir, proqram isə tarixi "yyyy/MM/dd" formatında və üstəlik həftə gününü çıxarmalıdır.

Nümunə

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Scanner;

public class BirthdayFormatDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Doğum tarixini daxil edin (dd.MM.yyyy): ");
        String input = scanner.nextLine();

        DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd");

        try {
            LocalDate birthday = LocalDate.parse(input, inputFormat);
            String formatted = birthday.format(outputFormat);
            System.out.println("Tarixinizin yeni formatı: " + formatted);
            System.out.println("Həftənin günü: " + birthday.getDayOfWeek()); // Məsələn, SATURDAY
        } catch (DateTimeParseException ex) {
            System.out.println("Xəta: tarix formatı yanlışdır!");
        }
    }
}

8. Lokallaşdırma: dil formatlaşdırmaya necə təsir edir

DateTimeFormatter ilə yalnız rəqəmlərin sırasını dəyişmək deyil, həm də ay adını sözlərlə, həftə gününü və s. çıxarmaq olar. Bu zaman lokal (dil və region) nəzərə alınır.

Nümunə: ayın adını rus dilində sözlərlə göstərmək

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class LocaleDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 6, 1);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", new Locale("ru"));
        System.out.println(date.format(formatter)); // 1 iyun 2025
    }
}

Nümunə: ingilis lokalı

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class LocaleEnDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 6, 1);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH);
        System.out.println(date.format(formatter)); // 1 June 2025
    }
}

Lifehack: ay və həftə gününün istədiyiniz dildə olmasını istəyirsinizsə — lokali açıq şəkildə göstərin!

9. Tarixlərin formatlaşdırılması və parsinqində tipik səhvlər

Xəta № 1: Şablonla sətirin uyğunsuzluğu.
Əgər sətir "01.06.2025 14:30"dirsə, şablon isə "dd.MM.yyyy"dirsə, parsinq səhv ilə bitəcək. Şablon sətirlə tam uyğun olmalıdır.

Xəta № 2: Şablon simvollarının qarışdırılması.
MM — ay, mm — dəqiqədir. Əgər "dd.mm.yyyy" yazsanız, Java bunun dəqiqələr olduğunu hesab edəcək və səhv verəcək. Ay üçün həmişə böyük M istifadə edin.

Xəta № 3: Parsinq zamanı istisnaların emal olunmaması.
DateTimeParseException tutulmasa, istifadəçi yanlış giriş etdikdə proqram qəfil dayana bilər. Belə səhvləri həmişə emal edin.

Xəta № 4: Sözlərdən istifadə ediləndə lokalın göstərilməməsi.
Əgər ayı sözlərlə verən şablondan (MMMM) istifadə edirsinizsə, lokal göstərilməyibsə, Java susmaya görə olan dili (məsələn, ingilis) istifadə edə bilər. Həmişə lazımi lokali açıq şəkildə təyin edin.

Xəta № 5: Köhnə siniflərin (SimpleDateFormat, Date) yeni layihələrdə istifadəsi.
Yadda saxlayın: müasir kodda yalnız java.timeDateTimeFormatter istifadə edin.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION