1. ZonedDateTimesınıf

Date Time API'sinde çok ilginç bir sınıf daha var: class ZonedDateTime. Ana amacı, farklı saat dilimlerindeki tarihlerle çalışmayı uygun hale getirmektir.

LocalDatetarihleri ​​temsil etmek için harikadır. Örneğin, doğum günleri. Nerede olursam olayım doğum günüm 15 Mart. Bu bir tarih örneğidir.

LocalTimeZamanı tarif etmek harika, çalar saatteki saat gibi: Alarmı sabah 5:00'e kurdum ve nerede olduğum önemli değil. 5:00 sabah 5:00. Bu, zamanla çalışmanın bir örneğidir.

Şimdi uçuş rezervasyonu yapan bir uygulama yazdığımızı varsayalım. Uçaklar yerel saate göre kalkar ve gelir. Uçak belirli bir süre havada kalır, ancak saat dilimleri değişebilir.

Zaman dilimleri

Bu arada, saat dilimleri tam bir karmaşa. Ve 24 saat dilimi olduğunu düşünüyorsanız, çok yanılıyorsunuz.

Örneğin, Hindistan'daki saat Greenwich Ortalama Saatinden beş buçuk saat farklıdır: GMT+5:30. Bazı ülkeler gün ışığından yararlanma saatine geçer, bazıları geçmez. Ayrıca, farklı ülkeler yılın farklı zamanlarında yaz saatine geçer.

Ve bazı ülkeler yaz saatini iptal eden ya da yeniden uygulamaya koyan ya da tekrar iptal eden yasalar çıkarır.

Her halükarda, dünyanın saat dilimleri vardır ve her saat diliminde bir zaman vardır. Farklı bölgelerdeki saatler yılın belirli dönemlerinde çakışabilir ve ardından diğer dönemlerde farklılık gösterebilir. Zaman dilimlerine genellikle içinde bulunan büyük şehirlerin adı verilir: Europe/Monaco, Asia/Singaporeancak istisnalar da vardır — US/Pacific.

Resmi olarak şu anda 599 saat dilimi var. Bir düşünün: 599. Bu 24'ten çok uzak. Küresel dünyaya hoş geldiniz.

ZoneIdPaketteki sınıf, Java'da java.timebir saat dilimini depolamak için kullanılır.

Bu arada, getAvailableZoneIds()şu anda bilinen tüm zaman dilimlerinin kümesini döndüren statik bir yöntemi vardır. Tüm bölgelerin bir listesini almak için aşağıdaki kodu yazmanız gerekir:

kod Konsol çıkışı (kısmi)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Bir ZoneIdnesneyi adıyla elde etmek için statik of()yöntemi kullanmanız gerekir;

kod Not
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. ZonedDateTimeNesne oluşturma

Bir nesne oluştururken ZonedDateTime, sınıfın statik now()yöntemini çağırmanız ve ZoneIdona bir nesne iletmeniz gerekir.

kod Konsol çıkışı
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

ZoneIdYönteme bir nesne iletmezseniz now()(ve buna izin verilir), saat dilimi programı çalıştıran bilgisayarın ayarlarına göre otomatik olarak belirlenir.

Örnek:

kod Konsol çıkışı
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Küresel bir tarihi yerel bir tarihe dönüştürme

İlginç özelliklerinden biri, ZonedDateTimeyerel bir tarih ve saate dönüştürme yeteneğidir. Örnek:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Zamanla Çalışmak

Sınıf gibi LocalDateTime, ZonedDateTimesınıfın da bir tarih ve saatin bireysel öğelerini almanın birçok yolu vardır. İşte bu yöntemlerin bir listesi:

int getYear()
Belirli bir tarihin yılını döndürür
Month getMonth()
Tarihin ayını döndürür: birkaç sabitten biri —JANUARY, FEBRUARY, ...;
int getMonthValue()
Tarihin ayının dizinini döndürür. Ocak == 1
int getDayOfMonth()
Ayın gününün dizinini verir
DayOfWeek getDayOfWeek()
Haftanın gününü döndürür: birkaç sabitten biri —MONDAY, TUESDAY, ...;
int getDayOfYear()
Yılın gününün indeksini verir
int getHour()
Saatleri döndürür
int getMinute()
dakikaları döndürür
int getSecond()
Saniyeleri döndürür
int getNano()
nanosaniyeleri döndürür

Tüm yöntemler, sınıfın yöntemlerine mükemmel şekilde benzer LocalDateTime. Ve tabii ki, ZonedDateTimesınıfın tarih ve saatlerle çalışmanıza izin veren yöntemleri vardır. Bununla birlikte, yöntemlerin çağrıldığı nesne değişmez. Bunun yerine yeni bir nesne döndürürler ZonedDateTime:

Yöntemler Tanım
plusYears(int)
Tarihe yıllar ekler
plusMonths(int)
Tarihe ay ekler
plusDays(int)
Tarihe gün ekler
plusHours(int)
Saat ekler
plusMinutes(int)
dakika ekler
plusSeconds(int)
saniye ekler
plusNanos(int)
nanosaniye ekler
minusYears(int)
Tarihten yılları çıkarır
minusMonths(int)
Ayları tarihten çıkarır
minusDays(int)
Günleri tarihten çıkarır
minusHours(int)
Saatleri çıkarır
minusMinutes(int)
Dakikaları çıkarır
minusSeconds(int)
Saniyeleri çıkarır
minusNanos(int)
Nanosaniyeleri çıkarır

Herhangi bir örnek vermeyeceğiz, çünkü buradaki her şeyin az önce incelediğimiz sınıflara benzetilerek açık olduğunu düşünüyoruz.