Java SE 8 ile tanıtılan java.time paketi (JSR 310 standardı), eski java.util.Date ve java.util.Calendar sınıflarının eksikliklerini ve iş parçacığı güvenliği (thread-safety) sorunlarını gideren modern, kapsamlı ve değiştirilemez (immutable) bir tarih-saat çerçevesi sunar.
- Tasarım İlkeleri ve Temel Sınıflar
- Yerel Tarih ve Saat (
LocalDate,LocalTime,LocalDateTime) - Zaman Dilimi ve Anlık Zaman (
ZonedDateTime,Instant) - Süre ve Aralıklar (
PeriodveDuration) - Biçimlendirme ve Ayrıştırma (
DateTimeFormatter)
java.time API'si şu temel ilkeler üzerine kurulmuştur:
- Değişmezlik ve İş Parçacığı Güvenliği (Immutability & Thread-Safety): Tüm temel sınıflar değişmezdir; çoklu iş parçacıklarında güvenle paylaşılabilir.
- Akıcı Arayüz (Fluent API): Metotlar zincirleme çağrılara uygundur (
date.plusDays(5).minusMonths(1)). - Açıklık: Sınıf adları ve metotlar temsil ettikleri kavramları açıkça ifade eder.
Zaman dilimi bilgisi içermeyen tarih ve saat sınıflarıdır:
import java.time.*;
// Yalnızca Tarih (Yıl-Ay-Gün)
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1995, Month.MAY, 23);
// Yalnızca Saat (Saat:Dakika:Saniye.Nanosaniye)
LocalTime now = LocalTime.now();
LocalTime meetingTime = LocalTime.of(14, 30);
// Tarih ve Saat Birlikte
LocalDateTime currentDateTime = LocalDateTime.now();
LocalDateTime customDateTime = LocalDateTime.of(today, meetingTime);
// Tarih Aritmetiği
LocalDate nextWeek = today.plusWeeks(1);
LocalDate lastMonth = today.minusMonths(1);Zaman çizelgesi üzerindeki anlık bir noktayı temsil eder (1 Ocak 1970 UTC'den itibaren geçen nanosaniye). Makine zamanı ve zaman damgaları için kullanılır:
Instant timestamp = Instant.now();Belirli bir zaman dilimine (ZoneId) sahip eksiksiz tarih-saat bilgisidir:
ZoneId istanbulZone = ZoneId.of("Europe/Istanbul");
ZonedDateTime istanbulTime = ZonedDateTime.now(istanbulZone);
ZoneId tokyoZone = ZoneId.of("Asia/Tokyo");
ZonedDateTime tokyoTime = istanbulTime.withZoneSameInstant(tokyoZone);Period: Tarih tabanlı zaman miktarını (yıl, ay, gün) temsil eder:LocalDate start = LocalDate.of(2020, 1, 1); LocalDate end = LocalDate.now(); Period period = Period.between(start, end); System.out.format("%d yıl, %d ay, %d gün%n", period.getYears(), period.getMonths(), period.getDays());
Duration: Zaman tabanlı süreyi (saniye, nanosaniye) temsil eder:Instant t1 = Instant.now(); // ... bir işlem gerçekleştir ... Instant t2 = Instant.now(); long millis = Duration.between(t1, t2).toMillis();
DateTimeFormatter sınıfı, tarih ve saat nesnelerini dizeye dönüştürmek veya metinleri nesneye ayrıştırmak (parse) için kullanılır:
LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// Nesneden Metne (Formatting)
String formattedDate = date.format(formatter);
System.out.println("Bugün: " + formattedDate);
// Metinden Nesneye (Parsing)
LocalDate parsedDate = LocalDate.parse("31/08/2026", formatter);