1. Sınıftan sınıfa DategeçişCalendar

DateProgramcılar , sınıfı sadeliği ve Unix standartlarını desteklemesi nedeniyle sevdiler , ancak bildiğiniz gibi her gülün dikenleri vardır.

Programcılar "akıllı" bir Datesınıf istediler. Ve sınıf şeklinde istediklerini aldılar Calendar. Yalnızca tarihleri ​​depolamanın değil, aynı zamanda tarihlerle zor işlemleri gerçekleştirmenin bir yolu olarak tasarlandı.

Sınıfın tam adı Calendarjava.util.Calendar'dır. Kodunuzda kullanmaya karar verirseniz, onu bir import ifadesine eklemeyi unutmayın.

CalendarBu komutla bir nesne oluşturabilirsiniz :

Calendar date = Calendar.getInstance();

getInstance()Sınıfın statik yöntemi , geçerli tarihle başlatılan Calendarbir nesne oluşturur . Calendarİstediğiniz takvim, programı çalıştıran bilgisayarın ayarlarına göre oluşturulacaktır.

Daha doğrusu elinize geçen takvim... Çünkü Dünya'daki insanlar tek bir takvimle sınırlı değil. Bunun yerine, çok kullanırlar. Ve neredeyse her biri bir din veya ülke ile ilişkilidir. Sınıf Calendarbunlardan 3 tanesini destekler:

Takvim Tanım
Miladi takvim Hıristiyan Gregoryen takvimi
BudistTakvim Budist takvimi
Japon İmparatorluk Takvimi Japon imparatorluk takvimi

Ama bir de Çin ve Arap takvimleri var. Temel olarak, zamanla çalışmak göründüğü kadar kolay değildir.

Çin takviminde, bu dersin yazıldığı sırada yıl resmi olarak 4716'dır. Ve hicri takvime göre yıl 1398. Koca dünyaya hoş geldin programcı arkadaşım.

2. Takvim nesnesi oluşturma

Dünyada en yaygın takvim olduğu için Gregoryen takvimini kullanacağız. En azından Çin Oracle'ı satın alıp Çin takvimini ana takvim yapana kadar.

Bunun gibi bir ifade kullanarak herhangi bir tarihe sahip bir takvim nesnesi oluşturabilirsiniz:

Calendar date = new GregorianCalendar(year, month, day);

GregorianCalendarEvet, her seferinde yazmak zorundasın . yerine Calendaryazabilirsiniz GregorianCalendar- bu da işe yarayacaktır. Ancak yazmak Calendardaha kısadır.

Yıl tam olarak yazılmalıdır, örneğin 2019 yerine 19 yazamazsınız. Aylar hala sıfırdan numaralandırılmıştır. Ancak daha önce olduğu gibi, ayın günleri sıfırdan numaralandırılmaz. İnekler!

Tarihin yanı sıra saati de ayarlamak için, zamanı ek argümanlar olarak iletmeniz gerekir:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Gerekirse milisaniye cinsinden bile geçebilirsiniz. Saniye sayısından sonraki parametredir.

3. Ekranda bir takvim nesnesi görüntüleme

Ekrana bir takvim nesnesi yazdırırsanız, sonuçtan pek memnun kalmazsınız.

kod
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Konsol çıkışı
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Burada akılda tutulması gereken şey, bir takvimin bir tarih değil, bir takvim olduğudur : ekranda görüntülenecek her türlü ayara sahiptir.

Bir takvimi görüntülemek için bir nesne kullanmak uygun olur SimpleDateFormat, ancak biz onu inceleyene kadar bu cankurtaran tüyosunu kullanabilirsiniz.

Date date = calendar.getTime();

Bir Calendarnesne kolaylıkla bir nesneye dönüştürülebilir Dateve siz zaten bir nesneyi nasıl görüntüleyeceğinizi biliyorsunuz Date. CalendarBir nesneyi şuna dönüştürmek için bunun gibi bir kod kullanabilirsiniz Date:

Yöntemi kullanarak getTime():

kod Konsol çıkışı
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Bu çok farklı bir konu, değil mi?

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

Bir tarihin belirli bir öğesini (örneğin yıl, ay, ...) elde etmek için sınıfın yöntemi Calendarvardır get(). Bu tek bir yöntemdir, ancak parametreleri vardır:

int month = calendar.get(Calendar.MONTH);

Nerede calendarbir Calendardeğişkendir ve MONTHsınıfın sabit bir alanıdır Calendar.

CalendarSınıfın sabit alanlarından birini yönteme argüman olarak iletirsiniz getve sonuç olarak istenen değeri alırsınız.

örnekler

kod Tanım
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


çağ (ortak çağdan önce veya sonra)
yıl
ay
ayın günü

haftanın
günü saat
dakika
saniye

Bir tarihin bir öğesini değiştirmek için şu setyöntemi kullanın:

calendar.set(Calendar.MONTH, value);

Nerede calendarbir Calendardeğişkendir ve MONTHsınıfın sabit bir alanıdır Calendar.

Yöntemle çalışırken , sınıfın sabit alanlarından birini birinci bağımsız değişken olarak ve yeni değeri ikinci bağımsız değişken olarak setiletirsiniz .Calendar

örnekler

kod Tanım
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


yıl = 2019
ay = Temmuz (0'dan numaralandırılmıştır)
4. gün
saat
dakika
saniye

5. Sınıfın Calendarsabitleri

Sınıfın sabit alanları, Calendarbir tarihin öğelerini adlandırmak için olanlarla sınırlı değildir. Her durum için alanlar var gibi görünüyor.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Örneğin, aylara atıfta bulunmak için sabit alanlar vardır:

Ve ayrıca haftanın günleri:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Her şeyi listelemeyeceğiz. Kodda bunun gibi sabitler görürseniz şaşırmanızı istemiyoruz.

Sabitleri kullanmak, kodu daha okunabilir hale getirir, bu nedenle programcılar bunları kullanır. Okunabilirliği artırmak için aylar da sıfırdan numaralandırılmıştır. Ya da değil.

Calendar6. Bir nesnedeki tarihi değiştirme

Sınıfın, Calendarbir tarihte daha akıllı şekillerde işlem yapmanızı sağlayan bir yöntemi vardır. Örneğin, bir tarihe yıl, ay veya birkaç gün ekleyebilirsiniz. Ya da onları uzaklaştırın. Bu yöntem denir add(). Bununla çalışmak şöyle görünür:

calendar.add(Calendar.MONTH, value);

Nerede calendarbir Calendardeğişkendir ve MONTHsınıfın sabit bir alanıdır Calendar.

Yöntemle çalışırken , sınıfın sabit alanlarından birini birinci bağımsız değişken olarak ve ikinci bağımsız değişken olarak eklenecek yeni değeri addiletirsiniz .Calendar

Bu başka bir akıllı yöntemdir. Ne kadar akıllı olduğunu görelim:

kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Konsol çıkışı
Fri Mar 01 00:00:00 EET 2019

Bu yöntem, Şubat 2019'da yalnızca 28 gün olduğunu anlar, bu nedenle sonuç tarihi 1 Mart'tır.

Şimdi 2 ayı ayıralım! Ne almalıyız? 27 Aralık 2018! Şimdi kontrol edelim.

Daha erken bir tarihle sonuçlanan bir işlem gerçekleştirmek için, yönteme negatif bir değer iletmeniz gerekir add():

kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konsol çıkışı
Thu Dec 27 00:00:00 EET 2018

İşe yarıyor!

Bu yöntem, artık yılların yanı sıra farklı ay uzunluklarını da hesaba katar. Sonuç olarak, harika bir yöntem. Tarihlerle çalışan çoğu programcının tam olarak ihtiyaç duyduğu şey budur.

7. Bir tarihin yuvarlanan öğeleri

Ancak bazen bu akıllıca davranışı istemediğimiz durumlar olabilir, örneğin, diğer her şeyi değiştirmeden tarihin bir bölümünde bir şeyler yapmak istiyorsunuz.

Sınıfın bunun için Calendarözel bir yöntemi var . roll()İmzası tıpkı yöntem gibidir add(), ancak bu yöntem tarihin yalnızca bir öğesini değiştirir, geri kalanını değiştirmez.

Örnek:

kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konsol çıkışı
Fri Dec 27 00:00:00 EET 2019

Ayı değiştirdik ama yıl ve tarih değişmedi.