Daty i czas: Klasa java.util.GregorianCalendar
Klasa GregorianCalendar jest klasą dziedziczącą po Calendar.
Klasa GregorianCalendar obejmuje kalendarz hybrydowy będący jednocześnie kalendarzem gregoriańskim i juliańskim:
- kalendarz gregoriański odejmujący daty od 15 października 1582 r do dziś
- proleptyczny kalendarz gregoriański obejmujący:
- kalendarz juliański od 1 marca 4 r n.e. do 4 października 1582 r.
- proleptyczny kalendarz juliański: od nieskończoności do końca lutego 4 r n.e.
Dla krajów, które od razu przyjęły kalendarz gregoriański daty od 5 października 1582 r. do 14 października nigdy nie istniały. W Polsce kalendarz gregoriański przyjęto od razu. W innych krajach z pewnym opóźnieniem. W niektórych krajach dla celów religijnych nadal stosuje się kalendarz juliański.
Jedyną różnicą między kalendarzem juliańskim i gregoriańskim jest odmienny sposób naliczania lat przestępnych.
Kalendarz juliański operuje rokiem 365,25 dniowym. Przeciętny rok ma 365 dni, a w roku, którego liczba jest podzielna przez 4, czyli raz na 4 lata, dodaje się jeden rok przestępny. Ponieważ faktyczna długość roku wynosi 365,2422 dnia, kalendarz juliański śpieszy się w stosunku do Słońca. Różnica ta wynosi 365,25 – 365,2422 = 0,0078 dnia rocznie, czyli 1 dzień na 128 lat, gdyż 0,0078 x 128 = 0.9984, czyli w przybliżeniu 1. Czyli po 128 juliańskich latach kalendarz wskazuje datę o 1 dzień późniejszą niż Słońce.
Lata przestępne w kalendarzu gregoriańskim są liczone tak samo jak w juliańskim (czyli
każdy rok, który dzieli się przez 4) z wyjątkiem dat mających 00 na końcu. Lata, które dzielą się przez 100, ale nie przez 400, są zwykłymi latami. Lata podzielne przez 100 i przez 400 są latami przestępnymi. Czyli rok 1700, 1800, 1900 były zwykłe, a lata 1600 i 2000 były przestępne.
Ten sposób liczenia powoduje, że kalendarz rozmija się ze Słońcem o 1 dzień na 3226 lat. Można to policzyć następująco: W ciągu 400 lat mamy (400 x 365) + (100 – 4 (podzielne przez 100)) + 1 dzień (podzielny przez 100 i przez 400) = 146097 dni kalendarza. Według Słońca mamy 400 x 365.24219 = 146096,876, czyli różnica wynosi 0,124 dnia na 400 lat, czyli 1 dzień na 3226 lat, co dla praktycznych celów jest całkiem dobrą dokładnością.
Daty historyczne są dokładne od 1 marca 4 r. n.e. Wcześniej lata przestępne były różnie naliczane.
W kalendarzu juliańskim Nowy Rok przypadał 25 marca. W GregorianCalendar zawsze jest to 1 stycznia. W prypadkach koniecznych należy wprowadzić (sobie) korektę – Nowy Rok będzie przypadał między 1 stycznia a 24 marca.
Kalendarz przyjmuje historyczny porządek dat i nieistnienie roku 0. Historycznie przed rokiem 1 p.n.e występuje 1 r. p.n.e. i nie ma roku zerowego, który występuje przy atronomicznym porządku dat.
Erę ustawiamy metodą set(Calendar.ERA, GregorianCalendar.BC) dla lat przed naszą erą albo set(Calendar.ERA, GregorianCalendar.AD) dla lat naszej ery.
Aby przeliczyć daty z systemu klasycznego na astronomiczny, należy od roku w systemie klasycznym odjąć 1 i zmienić znak roku na przeciwny.
395 p.n.e – 1 = 394 = -394
Aby przeliczyć rok astronomiczny na klasyczny, należy zmienić znak przed rokiem na
dodatni, a następnie dodać do roku liczbę 1.
-394 = 394 = 394 + 1 = 395.
W klasie GregorianCalendar obowiązują te same reguły dotyczące tygodnia roku i roku tygodniowego co w klasie Calendar
.
Domyślne wartości pól
Wartości te są używane jeśli wartość w jakimś polu pozostała niezdefiniowana.
Pole | Wartość domyślna | Opis |
---|---|---|
ERA | GregorianCalendar.AD | Anno Domini, Roku Pańskiego, n. e. |
YEAR | 1970 | Rok |
MONTH | JANUARY | Miesiąc styczeń. |
DAY_OF_MONTH | 1 | Pierwszy dzień miesiąca, 1 |
DAY_OF_WEEK | Monday | Dzień tygodnia. Poniedziałek |
WEEK_OF_MONTH | 0 | Tydzień miesiąca, 0 |
DAY_OF_WEEK_IN_MONTH | 1 | Dzień tygodnia w miesiącu, 1 |
AM_PM | 1 | Ante meridiem (przed południem), Post meridiem (po południu), 1, AM |
HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND | 0 | Godzina, godzina dnia, minuta, sekunda, milisekunda |
Pola statyczne
- GregorianCalendar.AD – Nasza era (n.e.). AD oznacza Anno Domini (Roku Pańskiego). Zaczynają się od 1 w gorę. Rok 2 jest rokiem późniejszym niż rok 1.
- GregorianCalendar.BC – Przed naszą erą (p.n.e). BC oznacza Before Christ (Przed Chrystusem). Zaczynają się od 1 w dół. Rok drugi jest rokiem wcześniejszym niż 1
Konstruktory
- GregorianCalendar() – ustawiony na bieżącą datę i czas w domyślnej strefie czasowej i domyślnej lokalizacji
- GregorianCalendar(int year, int month, int day) – ustawiony na podaną datę i bieżący czas w domyślnej strefie czasowej i domyślnej lokalizacji
- GregorianCalendar(int year, int month, int day, int hour, int minute) – ustawiony na podaną datę i podany czas w domyślnej strefie czasowej i domyślnej lokalizacji
- GregorianCalendar(int year, int month, int day, int hour, int minute, int second) – ustawiony na podaną datę i podany czas w domyślnej strefie czasowej i domyślnej lokalizacji
- GregorianCalendar(Locale aLocale) – ustawiony na bieżącą datę i czas, w domyślnej strefie czasowej, dla podanej lokalizacji
- GregorianCalendar(TimeZone zone) – ustawiony na bieżącą datę i czas w podanej strefie czasowej dla domyślnej lokalizacji.
- GregorianCalendar(TimeZone zone, Locale aLocale) – ustawiony na bieżącą datę i czas w podanej strefie czasowej dla podanej lokalizacji.
package dt09.java_util_gregoriancalendar; import java.util.*; public class Listing059 { public static void main(String[] args) { GregorianCalendar gc1 = new GregorianCalendar(); System.out.println("gcl: " + gc1); GregorianCalendar gc2 = new GregorianCalendar(1952, 5, 4); System.out.println("gc2: " + gc2); GregorianCalendar gc3 = new GregorianCalendar(1952, 5, 4, 21, 5); System.out.println("gc3: " + gc3); GregorianCalendar gc4 = new GregorianCalendar(1952, 5, 4, 21, 5, 0); System.out.println("gc4: " + gc4); Locale lc = Locale.getDefault(); GregorianCalendar gc5 = new GregorianCalendar(lc); System.out.println("gc5: " + gc5); SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); GregorianCalendar gc6 = new GregorianCalendar(stz); System.out.println("gc6: " + gc6); GregorianCalendar gc7 = new GregorianCalendar(stz, lc); System.out.println("gc7: " + gc7); } }
gcl: java.util.GregorianCalendar[time=1538843910496,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Belgrade",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=119,lastRule=java.util.SimpleTimeZone[id=Europe/Belgrade,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=279,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=38,SECOND=30,MILLISECOND=496,ZONE_OFFSET=3600000,DST_OFFSET=3600000] gc2: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Belgrade",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=119,lastRule=java.util.SimpleTimeZone[id=Europe/Belgrade,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=?,YEAR=1952,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=4,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=?] gc3: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Belgrade",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=119,lastRule=java.util.SimpleTimeZone[id=Europe/Belgrade,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=?,YEAR=1952,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=4,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=5,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?] gc4: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Belgrade",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=119,lastRule=java.util.SimpleTimeZone[id=Europe/Belgrade,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=?,YEAR=1952,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=4,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=5,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?] gc5: java.util.GregorianCalendar[time=1538843910522,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Belgrade",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=119,lastRule=java.util.SimpleTimeZone[id=Europe/Belgrade,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=279,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=38,SECOND=30,MILLISECOND=522,ZONE_OFFSET=3600000,DST_OFFSET=3600000] gc6: java.util.GregorianCalendar[time=1538843910522,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=1996,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=10800000,endTimeMode=0],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=279,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=38,SECOND=30,MILLISECOND=522,ZONE_OFFSET=3600000,DST_OFFSET=3600000] gc7: java.util.GregorianCalendar[time=1538843910524,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=1996,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=10800000,endTimeMode=0],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=279,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=38,SECOND=30,MILLISECOND=524,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
Metody
Zwraca | Metoda | Opis |
---|---|---|
GregorianCalendar | GregorianCalendar.from(ZonedDateTime zdt) | Przekształca java.time.ZoneDateTime w obiekt GregorianCalendar |
String | getCalendarType() | Zwraca typ kalendarza |
Date | getGregorianChange() | Zwraca datę wprowadzenia kalendarza gregoriańskiego |
void | setGregorianChange(Date date) | Ustawia datę od której obowiązuje kalendarz gregoriański |
ZonedDateTime | toZonedDateTime() | Przekształca ten kalendarz w obiekt java.time.ZonedDateTime |
package dt09.java_util_gregoriancalendar; import java.time.*; import java.util.*; public class Listing060 { public static void main(String[] args) { Locale lc = Locale.getDefault(); SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); GregorianCalendar cal = new GregorianCalendar(stz, lc); // String ct = cal.getCalendarType(); System.out.println("ct: " + ct); Date dt = cal.getGregorianChange(); System.out.println("dt: " + dt); cal.setGregorianChange(dt); ZonedDateTime zdt = cal.toZonedDateTime(); System.out.println("zdt: " + zdt); GregorianCalendar cal1 = GregorianCalendar.from(zdt); System.out.println("cal1: " + cal1); } }
ct: gregory dt: Fri Oct 15 01:00:00 CET 1582 zdt: 2018-10-06T18:41:38.997+02:00[Europe/Warsaw] cal1: java.util.GregorianCalendar[time=1538844098997,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Warsaw",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=279,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=41,SECOND=38,MILLISECOND=997,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
Przykład z dokumentacji klasy
package dt09.java_util_gregoriancalendar; import java.util.*; public class Listing061 { public static void main(String[] args) { // get the supported ids for GMT-08:00 (Pacific Standard Time) String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000); // begin output System.out.println("Current Time"); // create a Pacific Standard Time time zone SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]); // set up rules for Daylight Saving Time pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); // create a GregorianCalendar with the Pacific Daylight time zone // and the current date and time Calendar calendar = new GregorianCalendar(pdt); Date trialTime = new Date(); calendar.setTime(trialTime); // print out a bunch of interesting things System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println( "WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println( "WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println( "DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out .println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out .println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out .println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out .println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); System.out.println("Current Time, with hour reset to 3"); calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override calendar.set(Calendar.HOUR, 3); System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println( "WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println( "WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println( "DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out .println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out .println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out .println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out .println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); // in hours System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); // in hours } }
Current Time ERA: 1 YEAR: 2018 MONTH: 9 WEEK_OF_YEAR: 40 WEEK_OF_MONTH: 1 DATE: 6 DAY_OF_MONTH: 6 DAY_OF_YEAR: 279 DAY_OF_WEEK: 7 DAY_OF_WEEK_IN_MONTH: 1 AM_PM: 0 HOUR: 9 HOUR_OF_DAY: 9 MINUTE: 44 SECOND: 20 MILLISECOND: 636 ZONE_OFFSET: -8 DST_OFFSET: 1 Current Time, with hour reset to 3 ERA: 1 YEAR: 2018 MONTH: 9 WEEK_OF_YEAR: 40 WEEK_OF_MONTH: 1 DATE: 6 DAY_OF_MONTH: 6 DAY_OF_YEAR: 279 DAY_OF_WEEK: 7 DAY_OF_WEEK_IN_MONTH: 1 AM_PM: 0 HOUR: 3 HOUR_OF_DAY: 3 MINUTE: 44 SECOND: 20 MILLISECOND: 636 ZONE_OFFSET: -8 DST_OFFSET: 1