Java 8 : Date/Time API

JDK 1.0 ile beraber Date sınıfı java’ya kazandırılmıştı. Date sınıfında görülen eksiklikler sonrasında, bu eksikleri kapatmak için bir sonraki sürümde yani JDK 1.1 ile Calendar sınıfı geldi. Fakat bu tasarımların kusurları ve tutarsızlıkları nedeniyle, kurumsal uygulamaların çoğu JodaTime gibi third-party çözümleri kullanmak zorunda kalmıştır. Java’nın sürümleri ile ilgili detaylı yazıyı okumak için tıklayınız.

Java 8 ile beraber, eski tarih-zaman API’sinin (java.util.Date ve java.util.Calendar) dezavantajlarını karşılamak için yeni bir tarih-zaman API’si tanıtıldı. Bu yeni API, java.time paketi altında bulunur. Eğer JodaTime ile çalıştıysanız, öğrenmeniz gerçekten kolay olacaktır. Aslına bakarsanız, JodaTime’ı hiç duymamış insanların bile öğrenmesi kolay olacaktır; çünkü basit düşünülerek tasarlanmıştır.

Önce aşağıdaki kodlara bakıp geçmişi hatırlayalım ve sonra dezavantajlardan bahsedelim.

  • Immutable ve Thread Safejava.util.Date ve java.util.Calendar API’leri thread-safe değildir ve olası eşzamanlılık sorunlarına yol açmaktadır. (Immutable ile  ilgili detaylı  bilgiyi buradan okuyabilirsiniz.) Java 8’deki Tarih ve Zaman API’leri immutable‘dir ve bu nedenle thread-safe’dir.
  • Uygun API tasarımı ve çeşitli yardımcı metotlarjava.util.Date ve java.util.Calendar API’leri yardımcı metotlar açısından epeyce eksiktir. Bu sebeplerden dolayı java 8 olmayan projelerimizde ayrıyeten bir DateUtil API’si yazılmıştır. Yeni Tarih / Zaman API’sı ISO-8601 merkezlidir ve çeşitli faydalı yöntemlere sahiptir.
  • Zaman Dilimi – Daha önce java.util.Date ve java.util.Calendar API’leri ile farklı zaman dilimi (timezone) kullanmak çok zordu. Ayrıca zaman dilimlerine sıkı sıkı bağımlıydı. Java 8 ile beraber zaman dilimleri bağımsız oldular. İhtiyaç doğrultusunda rahatlıkla kullanabilirsiniz.
  • Okunabilirlik – Java 8 tarih-zaman API’sinden önce, Java tarafından sağlanan yöntemlerin çoğunun okunabilirliği yoktu ve kullanımdan önce kodun altında yatan çalışma hakkında bilgiye ihtiyaç vardı.
  • Kötü Tasarım – Date sınıfı tarih değil, timestamp’dir. Calendar ise tarih ve zamanın karışımıdır. Ayrıca yıl1900’den başlar, ay 1’den başlar ve gün 0’dan başlar.

ISO-8601 Standardı

ISO-8601, standart bir tarih ve saat sunma yöntemini kullanmak isteyen herkes tarafından kullanılabilir. Uluslararası iletişim kurarken belirsizlik ve karışıklığı ortadan kaldırmaya yardımcı olur. Detaylı bilgi için tıklayınız. Java da artık bu standardı kullanmaya başladı.

Java 8 : Date/Time API

LocalDate, LocalTime, LocalDateTime, Period ve Duration gibi yaygın olarak kullanılan tüm sınıflar java.time paketinin bir parçasıdır.

LocalDate

LocalDate sınıfı, ISO-8601 standardını kullanan ve zaman dilimi olmayan tarih sınıfıdır. Örneğin ; 2018-12-03.

LocalTime

LocalTime sınıfı, ISO-8601 standardını kullanan ve zaman dilimi olmayan zaman sınıfıdır.

Örneğin ; 10:15:30.

LocalDateTime

LocalDateTime sınıfı, ISO-8601 standardını kullanan ve zaman dilimi olmayan tarih-zaman sınıfıdır. Örneğin ; 2018-05-15T10:01:14.911

Zoned Date-Time API

Java 8 de, zaman dilimini belirli bir tarih ve saatle başa çıkmak için ZonedDateTime sınıfı vardır. ZoneId, farklı bölgeleri temsil etmek için kullanılan bir tanımlayıcıdır.

Chrono Units Enum

Zaman birimlerini göstermek için java.time.temporal.ChronoUnit enum’u geldi. Bu enum içerisinde 100 yıl , 10 yıl , 1 yıl , 1 hafta gibi zaman birimleri bulunmaktadır.

Period and Duration

Java 8 ile, iki tarih ve iki zaman arasındaki farkları hesaplamak için iki özel sınıf tanıtıldı.

  • Period – Tarih bazlı aralık ile ilgilenir.
  • Duration – Zaman bazlı aralık ile ilgilenir.

Temporal Adjusters

TemporalAdjuster, tarih matematiğini yapmak için kullanılır. Örneğin, “Ayın İkinci Cumartesi” veya “Gelecek Salı” olsun. Hadi bir örnek yapalım.

Backward Compatibility (Geriye dönük uyumluluk)

Yeni Date-Time API’sine dönüştürmek için Date and Calendar sınıflarına toInstant() yöntemi eklendi. LocalDateTime veya ZonedDateTime nesnesi almak için ofInstant (Insant, ZoneId) yöntemini kullanabilirsiniz.

DateTimeFormatter

İstenilen deseni kullanarak belirli bir tarihi ayrıştırmak mümkündür.

Bu yazıda, tarihler ve zamanlar arasındaki farklılaşma ve yeni tarih / zaman API’sı tarafından sunulan özelliklerin ve olanakların çoğunu açıklamaya çalıştım. Ama daha yazamadığım birçok özelliği mevcuttur. Java dokümantasyonunu okuyarak, bir yandan da örnekler yaparak öğrendiklerinizi pekiştirebilirsiniz. Ayrıca yazdığım test kodlarını githubdan çekebilirsiniz.

Kaynaklar

Beğenebileceğiniz Diğer Yazılar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir