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 |
|---|---|---|
|
2025-06-01 | Yalnız tarix (il-ay-gün) |
|
14:30:00 | Yalnız vaxt (saat:dəqiqə:san) |
|
2025-06-01T14:30:00 | Saat qurşağı olmadan tarix və vaxt |
|
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 (yyyy — 2025)
- M — ay (MM — 06)
- d — gün (dd — 01)
- H — saat (24-saat formatı, HH — 14)
- m — dəqiqələr (mm — 30)
- s — saniyələr (ss — 00)
Şablon nümunələri
| Şablon | Nəticə nümunəsi |
|---|---|
|
01.06.2025 |
|
2025/06/01 |
|
01.06.2025 14:30 |
|
2025-06-01 14:30:00 |
|
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
- Lazımi obyekti yaradın (LocalDate, LocalDateTime, ZonedDateTime və s.).
- Lazımi formatlaşdırıcını yaradın və ya seçin.
- 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
- Sətiri alın (məsələn, istifadəçidən).
- Sətirlə eyni şablonu olan formatlaşdırıcı yaradın.
- 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.time və DateTimeFormatter istifadə edin.
GO TO FULL VERSION