1. Date Time API Tanıtımı

Date Time API Tanıtımı

Java'nın yaratıcıları, Date ve Calendar sınıflarındaki durumu beğenmedi. Zamanında iyiydiler ama zaman değişiyor. Ve basit, güçlü ve güvenilir bir şey gerekli hale geldi. Ve Java 8'in piyasaya sürülmesiyle ( Calendarortaya çıktıktan 15 yıl sonra), Java Date Time API tanıtıldı. Zamanla ilgili her olası görevi çözebilmesi gereken bir sınıflar kümesidir.

O kadar çok sınıf vardı ki, birkaç pakete ayrıldılar:

Paket, Java java.timeDate Time API için temel pakettir: LocalDate, LocalTime, , , ve gibi sınıfları içerir . Bu sınıfların tüm nesneleri , yani oluşturulduktan sonra değiştirilemezler.LocalDateTimeInstantPeriodDurationimmutable

Paket java.time.format, zaman formatlaması için sınıflar içerir, yani saatleri (ve tarihleri) dizgelere dönüştürmek ve tersi. Örneğin, DateTimeFormattersınıfın yerini alan çok yönlü sınıfı içerir SimpleDateFormat.

Paket java.time.zone, saat dilimleriyle çalışmak için sınıflar içerir. TimeZoneve gibi sınıfları içerir ZonedDateTime. Dünyanın farklı yerlerinde bulunan istemciler için sunucu kodu yazıyorsanız, bu sınıflara gerçekten ihtiyacınız olacak.


2. LocalDatesınıf

Date Time API'sinden inceleyeceğimiz ilk ve en yararlı sınıf, sınıftır LocalDate. Adından da tahmin edebileceğiniz gibi, bu sınıf tarihlerle çalışacak şekilde tasarlanmıştır.

Bu sınıfın nesneleri oluşturulduktan sonra değişmez, yani LocalDatesınıf değişmez. Ancak bu özellik, sınıfa basitlik ve güvenilirlik katar. Özellikle birkaç iş parçacığı (yürütme iş parçacığı) aynı anda böyle bir nesneyle etkileşime giriyorsa.

Yeni bir nesne oluşturmak için LocalDatestatik yöntemlerden birini kullanmanız gerekir. İşte ana olanların bir listesi.

Geçerli tarihi alma

Geçerli tarihi almak için statik yöntemi kullanmanız gerekir now(). Bu göründüğünden çok daha kolay:

LocalDate today = LocalDate.now();

Nerede todaybir LocalDatedeğişkendir ve sınıfın LocalDate.now()statik yöntemine yapılan bir çağrıdır .now()LocalDate

Örnek:

kod Konsol çıkışı
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Belirli bir saat diliminde tarih alma

Sınıf ayrıca , geçerli tarihi belirli bir saat diliminde almanızı sağlayan LocalDatebir yöntem varyasyonuna sahiptir .now(ZoneId)

Bunu yapmak için başka bir sınıfa ihtiyacımız var — ZoneIdsınıf (java.time.ZoneId). Zaman diliminin adı verilen of()bir nesneyi döndüren bir yöntemi vardır .ZoneId

Şangay'daki güncel tarihi belirlemek için aşağıdaki kodu yazmanız gerekir:

kod Konsol çıkışı
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

İnternette tüm saat dilimlerinin adlarının bir listesini bulabilirsiniz.


3. Belirli bir tarih almak

Belirli bir tarihi temsil eden bir nesne elde etmek için LocalDatestatik yöntemi kullanmanız gerekir of(). Buradaki her şey de çok basit ve net:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Nerede datebir LocalDatedeğişkendir ve sınıfın statik yöntemine yapılan bir çağrıdır .LocalDate.of()of()LocalDate

FEBRUARYBurada sınıfın sabitinin Month(java.time.Month) Şubat ayını ay olarak belirtmek için kullanıldığını görüyoruz .

Ayı eski moda bir şekilde - bir sayı kullanarak da belirleyebilirsiniz:

LocalDate date = LocalDate.of(2019, 2, 22);

İki? Şubat yerine? Bu, ayların bir kez daha birden numaralandırıldığı anlamına mı geliyor?

Evet, Java'nın yaratılmasından yaklaşık 20 yıl sonra, aylar nihayet sıfırdan sayılmayı bıraktı.

Örnek:

kod Konsol çıkışı
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Günün indeksine göre tarih alma

Tarih oluşturmanın başka ilginç bir yolu daha var: yöntemi kullanarak ofYearDay, yalnızca yıl sayısına ve yıl içindeki gün indeksine dayalı bir tarih alabilirsiniz. İşte genel görünüm:

LocalDate date = LocalDate.ofYearDay(year, day);

yearYılın sayısı nerede ve yıl dayiçindeki günün dizini.

Örnek:

kod Konsol çıkışı
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

2019'un 100. günü 10 Nisan.

Unix tarihi alma

Date1 Ocak 1970'ten bu yana nesnelerin zamanı her zaman milisaniye cinsinden sakladığını hatırlıyor musunuz ? Programcıların eski güzel günleri kaçırmamasını sağlamak için sınıf, 1 Ocak 1970'ten hesaplanan tarihi döndüren LocalDatebir yöntem aldı . İşte genel görünüm:ofEpochDay()

LocalDate date = LocalDate.ofEpochDay(day);

day1 Ocak 1970 tarihinden bu yana geçen gün sayısı nerede ?

Örnek:

kod Konsol çıkışı
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Bir tarihin öğelerini alma

Nesneleri değiştirmek imkansızdır LocalDate, ancak saklanan tarihin ayrı ayrı öğelerini alabilirsiniz. LocalDatenesnelerin bunun için birkaç yöntemi vardır:

Yöntem Tanım
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
int getDayOfYear()
Yılın başından itibaren günün indeksini verir
DayOfWeek getDayOfWeek()
Haftanın gününü döndürür: birkaç sabitten biri
MONDAY, TUESDAY, ...;
IsoEra getEra()
Çağı döndürür: BCE(Mevcut Çağdan Önce) ve CE(Mevcut Çağdan Önce)

Örnek:

kod Konsol çıkışı
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

LocalDate5. Bir nesnedeki tarihi değiştirme

Sınıf LocalDate, tarihlerle çalışmanıza izin veren çeşitli yöntemler içerir. Bu yöntemlerin uygulanması, sınıfın yöntemlerine benzer String: mevcut nesneyi değiştirmezler LocalDate, bunun yerine istenen verilerle yeni bir nesne döndürürler.

İşte sınıfın yöntemleri LocalDate:

Yöntem Tanım
plusDays(int days)
Tarihe belirli sayıda gün ekler
plusWeeks(int weeks)
Tarihe hafta ekler
plusMonths(int months)
Tarihe ay ekler
plusYears(int years)
Tarihe yıllar ekler
minusDays(int days)
Günleri tarihten çıkarır
minusWeeks(int weeks)
Tarihten haftaları çıkarır
minusMonths(int months)
Ayları tarihten çıkarır
minusYears(int years)
Tarihten yılları çıkarır

Örnek:

kod Konsol çıkışı
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Kimin birthday objectmetotları dediğimiz değişmiyor. Bunun yerine, yöntemleri istenen verileri içeren yeni nesneler döndürür.