1. Datesınıf ve Unix zamanı

Java'nın en başından beri, dilin zaman ve tarihlerle çalışmak için özel bir sınıfı vardır — Date. Zamanla, tarihlerle çalışmak için birkaç sınıf daha ortaya çıktı, ancak programcılar Datebugün bile sınıfı kullanmaya devam ediyor.

Bunun nedeni çok basit ve kullanışlı olmasıdır. Ve bir programcı olarak, onunla herhangi bir gerçek projede kesinlikle karşılaşacaksınız. Kullanıp kullanmamak sizin seçiminiz, ancak bunu bilmelisiniz. Bu yüzden ona değerli zamanınızdan birkaç dakika ayırın.

Sınıfı bu kadar iyi yapan nedir Date? Sadeliği.

Sınıf , tarih ve saat bilgilerini 1 Ocak 1970'ten bu yana geçen milisaniye sayısıDate olarak depolar. Bu çok fazla milisaniyedir, bu nedenle tür bunları depolamak için kullanılır.long

İlginç.

Neden özellikle 1970'den beri? Bu sözde Unix zamanı : tüm modern işletim sistemlerinin atası olan Unix işletim sistemi zamanı bu şekilde tutar.

Ancak iki tarih arasında ne kadar zaman geçtiğini çok kolay bir şekilde öğrenebilirsiniz: bir tarihi diğerinden çıkarın ve tarihler arasındaki en yakın milisaniyeye kadar olan zaman farkını elde edin.

İşte sınıfla çalışmanın bazı yararlı örnekleri Date.


2. Geçerli tarihi alma

Geçerli saati ve tarihi almak için bir Datenesne oluşturmanız yeterlidir. Her yeni nesne, oluşturulduğu zamanı saklar. Çok basit görünüyor:

Date current = new Date();

Bu komutu yürüttükten sonra currentdeğişken, oluşturulan Datenesneye, oluşturulma zamanını (1 Ocak 1970'ten bu yana geçen milisaniye sayısı) dahili olarak depolayacak bir referans depolayacaktır.

Geçerli tarihin ekranda görüntülenmesi

Geçerli tarihi görüntülemek için basitçe: a) yeni bir Datenesne oluşturun, b) yöntemi kullanarak ekrana yazdırın System.out.println().

Örnek:

kod Konsol çıkışı
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

İşte konsol çıktısının anlamı:

Metin Tercüme
perşembe _ Perşembe
21 Şubat 21 Şubat
14:01:34 saat : dakika : saniye
Doğu Avrupa Zaman Dilimi Saat dilimi: Doğu Avrupa Saati
2019 Yıl

3. Belirli bir tarih belirlemek

DateŞimdiki zamanı nasıl alacağımızı bulduk, ancak farklı bir tarih veya saat saklayan bir nesneyi nasıl yaratırız ?

Yine, burada her şey basit. Belirli bir tarih belirlemek için aşağıdaki gibi bir kod yazmanız gerekir:

Date birthday = new Date(year, month, day);

Her şey basit ve açık, ancak dikkat edilmesi gereken iki nüans var:

  1. Yıl 1900'den sayılmalıdır.
  2. Aylar sıfırdan numaralandırılmıştır.
İlginç.

Bu, Unix işletim sisteminin bir başka mirasıdır: Unix'te programcılar yılı iki basamak kullanarak belirtirdi. 1977 yerine basitçe 77 yazdılar. Yani 1900'den itibaren sayarsak doğru yıl 77'dir.

Mesela ben 21 Mart 1989'da doğdum. Mart üçüncü aydır, bu yüzden şunu yazmam gerekiyor:

kod Konsol çıkışı
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Aylar sıfırdan numaralandırılmış ama günler değil Bu biraz garip değil mi?

Gerçek programcıların galip gelmesi ve ayın günlerini de sıfırdan numaralandırması gerektiğini düşünüyoruz. Ah bu konformistler 🙂

Belirli bir zaman ayarlama

Belirli bir zaman belirlemek de oldukça basittir: bunun için şöyle bir ifade yazmanız gerekir:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Saatler, dakikalar ve saniyeler sıfırdan numaralandırılmıştır: bırakın içinizdeki programcı rahat bir nefes alsın.

Örnek:

kod Konsol çıkışı
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Saati 12:15 ve tarihi 4 Haziran 2005 olarak ayarladık . Bunu programcı olmayan birinin okuması biraz zor ama olması gerektiği gibi çalışıyor.


4. Bir tarihin öğeleriyle çalışma

DateBir nesneyle onu görüntülemekten daha fazlasını yapabilirsiniz . Dahili olarak saklanan tarihin ayrı öğelerini almanıza izin veren yöntemleri vardır :

Yöntem Tanım
int getYear()
Tarihin yılını 1900'e göre döndürür.
int getMonth()
Tarihin ayını döndürür (aylar sıfırdan numaralandırılmıştır)
int getDate()
Ayın gününü döndürür
int getDay()
Haftanın gününü döndürür
int getHours()
Saatleri döndürür
int getMinutes()
dakikaları döndürür
int getSeconds()
Saniyeleri döndürür

Örnek:

kod Konsol çıkışı Not
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
Haziran Cumartesi
ayın günü

Bu arada, bir Datenesne yalnızca bir tarihin tek tek öğelerini almanıza değil, aynı zamanda bunları değiştirmenize de izin verir:

Yöntem Tanım
void setYear(int year) Tarihin yılını değiştirir. Yıl 1900'e göre belirtilir.
void setMonth(int month) Tarihin ayını değiştirir (aylar sıfırdan numaralandırılmıştır)
void setDate(int date) Ayın gününü değiştirir
void setHours(int hours) Saatleri değiştirir
void setMinutes(int minutes) Dakikaları değiştirir
void setSeconds(int seconds) Saniyeleri değiştirir

5. Milisaniye

Daha önce de söylediğimiz gibi, Datenesne 1 Ocak 1970'ten bu yana geçen milisaniye sayısını saklar.

Bu sayıya ihtiyacımız olursa, nesneden alabiliriz Date:

long time = date.getTime();

Yöntem , nesnenin getTime()içinde saklanan milisaniye sayısını döndürür Date.

Yalnızca milisaniye sayısını elde etmekle kalmaz, aynı zamanda mevcut bir nesnede bu sayıyı değiştirebilirsiniz:

Date date = new Date();
date.setTime(1117876500000L);

DateBu arada, nesneye yaratıldığı anda zaman geçirerek bunu daha da özlü bir şekilde yazabilirsiniz :

Date date = new Date(1117876500000L);

6. Tarihleri ​​karşılaştırma

İki tarihi karşılaştırmak ve hangisinin önce geldiğini öğrenmek istiyorsanız, üç seçeneğiniz var.

İlk yol , her birinin sakladığı milisaniye sayısını basitçe karşılaştırmaktır:

if (date1.getTime() < date2.getTime())

İkinci yolbefore() , bir nesnenin yöntemini kullanmaktır Date:

if (date1.before(date2))

Şöyle okur: 'dan date1önce gelirse date2, o zaman...

Üçüncü yol,after() bir nesnenin yöntemini kullanmaktır Date:

if (date2.after(date1))

Şöyle okur: if date2is after date1, o zaman...


7. DateFormatsınıf

Hatırlayın, tarihi ekranda gösterdiğimizde şöyle bir şey gördük: Thu Feb 21 14:01:34 EET 2019. Her şey doğru görünüyor, ancak format, normal insanlardan ziyade programcılar için bir tarihin nasıl gösterileceğidir. Kullanıcılar için tarihi daha net göstermek istiyoruz. gibi bir şey Tuesday, February 21.

Ve yıl olmadan. Veya gerekirse bir yıl ile. Genel olarak, tarihi farklı şekillerde gösterebilmek istiyoruz.

Bunun için özel bir sınıf var: SimpleDateFormat.

Örnek:

kod
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Konsol çıkışı
Jun-04-2005

Programın ne gösterdiğine bakın: Jun-04-2005. Eskiden böyle değildi.

Aradaki fark, nesnenin kendisini değil, bir nesne üzerinde yöntemi Dateçağırarak elde edilen özel bir diziyi görüntülememizdir . Ama buradaki asıl mesele bu bile değil.format()SimpleDateFormat

Nesne oluşturulduğunda, dizeyi parametre olarak SimpleDateFormatilettik . "MMM-dd-YYYY"En sonunda konsol çıktısında gördüğümüz tarih biçimini ileten bu dizedir.

  • MMM, üç harf kullanılarak kısaltılmış olarak ayın adını görüntülemeyi belirtir
  • dd ayın gününü görüntülemeyi belirtir
  • YYYY, yılı dört basamak kullanarak görüntülemeyi belirtir

Ayın çıktısını sayı olarak almak istiyorsak, yerine , kalıbı veren MMMyazmamız gerekir . Ekran çıkışı olacakMM"MM-dd-YYYY"06-04-2005

Bu sınıfı daha sonra daha ayrıntılı olarak tartışacağız.


8. Date.parseyöntem

Sınıf Dateilginç ve faydalı başka bir şey yapabilir — bir diziden tarih alabilir. Veya programcıların dediği gibi, bir diziyi çözümleyebilir.

parse()Bunun için özel bir yöntemi vardır . Ayrıştırma şöyle görünür:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

Bu arada, bu kod daha kompakt bir şekilde yazılabilir:

Date date = new Date("Jul 06 12:15:00 2019");

Dizelerin ayrıştırılmasını diğer derslerde daha ayrıntılı olarak ele alacağız .