[[oktatas:programozás:java|< Java]] ====== Java Dátum és idő ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Szerkesztve: 2014, 2015, 2019, 2022, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== A java.util.Date és java.sql.Date osztályok szokásos osztályok dátumok és idők tárolására, viszont sok elavult konstruktorral és metódussal rendelkeznek. Használjuk helyette a következő osztályokat: * java.time.LocalDate * java.time.LocalTime * java.time.LocalDateTime Dokumentáció: * https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/time/package-summary.html ===== System osztály ===== Az aktuális időt megkaphatjuk milliszekundumban, ami az eltelt milliszekundumok 1970-01-01 óta: System.out.println( System.currentTimeMillis() ); Megkaphatjuk a unix időbélyeget a currentTimeMillins() eredményét elosztva 1000-el. long unixTime = System.currentTimeMillis() / 1000L; Ezt egyszerűen MySQL-be írhatjuk. ===== Date osztály ===== A dátum tárolására alkalmas egyik osztály a Date. A DateFormat osztály csak formázásra használjuk, a tárolást a Date osztály végzi. import java.util.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; class Program01 { public static void main(String[] args) { Date datum = new Date(); DateFormat forma =new SimpleDateFormat("hh:mm:ss aa"); System.out.println(forma.format(datum)); } } A datum tartalmazza az aktuális dátumot, a datumFormatum objektum pedig a kiíratás formátumát. | yyyy | év | | MM | hónap | | dd | nap | | HH | óra | | mm | perc | | ss | másodperc | Egy komplex példa: "yyyy-MM-dd HH:mm:ss" A Date() konstruktor paraméterként elfogad egy long értéket: long milliszekundum = 1681239712847L; Date datum = new Date(milliszekundum); Ugyanakkor a Date objektumból lekérhető az aktuális idő long formátumban: Date most = new Date(); long milliszekundum = most.getTime(); ===== Calendar ===== A **Calendar** osztályt a **java.util** csomagban található. Általános Dátum és idő számításokhoz használható. import java.util.Calendar; class Program01 { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY,17); cal.set(Calendar.MINUTE,30); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); System.out.println(cal.get(Calendar.HOUR_OF_DAY)); } } Calendar cal = Calendar.getInstance(); System.out.println(cal.get(Calendar.YEAR)); System.out.println(cal.get(Calendar.MONTH)); System.out.println(cal.get(Calendar.DAY_OF_MONTH)); A hónapok esetén a januárt 0 képviseli! Calendar ger = new GregorianCalendar(2015, Calendar.JANUARY, 2); System.out.println(ger.get(Calendar.MONTH)); Összehasonlítás: Calendar ger = new GregorianCalendar(2015, Calendar.JANUARY, 2); Calendar gerMost = new GregorianCalendar(2015, Calendar.JANUARY, 2); if(ger.compareTo(gerMost)==0) { System.out.println("egyezik"); } Calendar most = new GregorianCalendar(2015, Calendar.MARCH, 2); Calendar esemeny = new GregorianCalendar(2015, Calendar.APRIL, 1); // after/before if(esemeny.after(most)) { System.out.println("utána"); } Calendar cal = Calendar.getInstance(); cal.set(2015, 2, 15); cal.add(Calendar.DAY_OF_MONTH, 1); System.out.println(cal.get(Calendar.YEAR)); System.out.println(cal.get(Calendar.MONTH)); System.out.println(cal.get(Calendar.DAY_OF_MONTH)); class Program3 { public static void main(String args[]) { java.util.Calendar c = java.util.Calendar.getInstance(); System.out.println(String.format("Születésnap: %1$tY-%1$tm-%1$te", c)); } } ===== GregorianCalendar ===== Calendar cal = new GregorianCalendar(); int ev = cal.get(Calendar.YEAR); int honap = cal.get(Calendar.MONTH); System.out.printf("%d-%d\n", ev, honap); Calendar cal = new GregorianCalendar(); // A dátum egy komponensének lekérdezése int era = cal.get(Calendar.ERA); // 0=BC, 1=AD int year = cal.get(Calendar.YEAR); // 2002 int month = cal.get(Calendar.MONTH); // 0=Jan, 1=Feb, ... int day = cal.get(Calendar.DAY_OF_MONTH); // 1... int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1=Sunday, 2=Monday, ... //metódus 1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dateWithoutTime = sdf.parse(sdf.format(new Date())); //metódus 2 Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); dateWithoutTime = cal.getTime(); public void convertDateToString() { Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyy/MM/dd"); try { System.out.println("Ma: " + dateFormat.format(calendar.getTime())); } catch (Exception e) { e.printStackTrace(); } } ==== Employee osztályban ==== import java.util.GregorianCalendar; import java.util.Calendar; class Employee { String name; GregorianCalendar dateOfBirth; public Employee (String name, int year, int month, int day) { this.name = name; this.dateOfBirth = new GregorianCalendar (year, month, day); } } public class App { public static void main(String[] args) { Employee emp = new Employee("Tréner Ferenc", 1982, 5, 27); System.out.println(emp.dateOfBirth.get(Calendar.YEAR)); System.out.println(emp.dateOfBirth.get(Calendar.MONTH)); System.out.println(emp.dateOfBirth.get(Calendar.DATE)); } } ===== Vegyes ===== import java.util.Date; import java.util.Calendar; import java.text.SimpleDateFormat; class Program01 { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); Date datum = cal.getTime(); SimpleDateFormat forma =new SimpleDateFormat("hh:mm:ss aa"); System.out.println(forma.format(datum)); } } import java.util.Calendar; import java.text.SimpleDateFormat; class Program2 { public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; public static String now() { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); return sdf.format(cal.getTime()); } public static void main(String[] argv) { System.out.println(now()); } } Más formátumban: SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss"); Dátum GregorianCalendarból: Date datum = new GregorianCalendar(2015, Calendar.MARCH, 2).getTime(); System.out.println( (new SimpleDateFormat("yyyy").format(datum)) ); ===== SimpleDateFormat ===== ^ Betű ^ Dátum vagy időkomponens ^ megjelenés ^ Példa ^ | G | időszámításunk előtt vagy után | szöveg | AD, i. u. | | y | év | év | 1996; 96 | | Y | hét év | év | 2009; 09 | | M | az év hónapja | hónap | July; Jul; 07 | | w | az év hete | szám | 27 | | W | a hét egy hónapban | szám | 2 | | D | nap az évben | szám | 189 | | d | a hónap napja | szám | 10 | | F | egy hónapban a hét napja | szám | 2 | | E | a hét napjának neve | szöveg | Tuesday; Tue | | u | a hét napjának száma (1 = Monday, ..., 7 = Sunday) | szám | 1 | | a | AM vagy PM jelölő | szöveg | PM | | H | a nap hányadik órája (0-23) | szám | 0 | | k | a nap hányadik órája (1-24) | szám | 24 | | K | hányadik óra délután vagy délelőtt (0-11) | szám | 0 | | h | hányadik óra délután vagy délelőtt (1-12) | szám | 12 | | m | az óra hányadi perce | szám | 30 | | s | percen belüli másodpercek | szám | 55 | | S | millimásodperc | szám | 978 | | z | időzóna | General time zone | Pacific Standard Time; PST; GMT-08:00 | | Z | időzóna | RFC 822 időzóna | -0800 | | X | időzóna | ISO 8601 időzóna | -08; -0800; -08:00 | ===== java.sql.Date ===== A java.sql.Date osztályt a JDBC API használja. Ha szeretnél beállítani egy dátumot a java.sql.PreparedStatement vagy visszakapni egy dátumot a java.sql.ResultSet használatával, akkor erre van szükségünk. A java.sql.Date valójában a java.util.Date osztály az őse. import java.text.SimpleDateFormat; class Program01 { public static void main(String[] args) { long time = System.currentTimeMillis(); java.sql.Date datum = new java.sql.Date(time); SimpleDateFormat forma = new SimpleDateFormat("hh:mm:ss"); System.out.println(forma.format(datum)); } } A java.sql.Date nem képviseli az időt, csak a dátumot, ellentétben a java.util.Date osztállyal. Az idő megőrzéséhez a java.sql.Timestamp osztályt használhatjuk. ===== java.sql.Timestamp osztály ===== A java.sql.Timestamp osztályt a JDBC API használja. Ha szeretnél beállítani egy dátumot vagy időt a java.sql.PreparedStatement vagy visszakapni egy dátumot vagy időt a java.sql.ResultSet használatával, akkor erre van szükségünk. A java.sql.Timestamp alkalmas a nanomásodperc tárolására is. ===== TimeZone ===== A java.util.TimeZone osztály az időzónák kezelését teszi lehetővé. Lehetőség van a nyári időszámítás kezelésére is. TimeZone tz = TimeZone.getTimeZone("Europe/Budapest"); A használható azonosítók lekérdezhetők a TimeZone.getAvailableIDs() metódussal: for(String egy : TimeZone.getAvailableIDs()) { System.out.println(egy); } Időzóna lekérdezése: class Program01 { public static void main(String args[]) { java.util.Calendar cal = java.util.Calendar.getInstance(); java.util.TimeZone idozona = cal.getTimeZone(); System.out.println("Az időzóna : " + idozona.getDisplayName()); } } ===== LocalDate ===== ==== Dátum tárolása ==== import java.time.LocalDate; class Program01 { public static void main(String[] args) { LocalDate localDate = LocalDate.of(2019,10,5); System.out.println(localDate); System.out.printf("%d\n", localDate.getYear()); } } ==== Szöveges dátum LocatDate formára ==== import java.time.LocalDate; class Program01 { public static void main(String[] args) { LocalDate ld2 = LocalDate.parse("2019-09-25"); System.out.println(ld2); } } ==== Formázott kivitel ==== import java.time.LocalDate; import java.time.format.DateTimeFormatter; class Program01 { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy. LLL dd."); LocalDate date = LocalDate.parse("2019-09-25"); System.out.println(formatter.format(date)); } } A kimenet: 2019. szept. 25. ==== Dátum kibontása ==== import java.time.LocalDate; class Program01 { public static void main(String[] args) { LocalDate date = LocalDate.parse("2019-09-25"); System.out.printf("%d-%d-%d\n", date.getYear(), date.getMonthValue(), date.getDayOfMonth() ); } } ==== Összehasonlítás ==== Lehetőségek: * isAfter() * isBefore() * isEqual() import java.time.LocalDate; import java.time.ZoneId; class App { public static void main(String[] args) { LocalDate localDate = LocalDate.parse("2023-04-05"); System.out.println(localDate.getMonthValue()); System.out.println(localDate.getYear()); LocalDate most = LocalDate.now(ZoneId.of("GMT+2")); System.out.println(most); if(localDate.isBefore(most)) { System.out.println("előtte van"); }else { System.out.println("utána van"); } } } ==== Forrás ==== * http://tutorials.jenkov.com/java-date-time/localdate.html * https://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant * https://www.boraji.com/java-8-localdate-example ===== LocalDateTime ===== ==== Dátum és idő tárolása ==== import java.time.LocalDateTime; class Program01 { public static void main(String[] args) { LocalDateTime dateTime = LocalDateTime.now(); System.out.printf("%d-%d-%d %d:%d:%d\n", dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth(), dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond() ); } } ==== Dátum és idő megadása ==== import java.time.LocalDateTime; import java.time.Month; class Program01 { public static void main(String[] args) { LocalDateTime dateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 26, 20, 1, 30); System.out.printf("%d-%d-%d %d:%d:%d\n", dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth(), dateTime.getHour(), dateTime.getMinute(), dateTime.getSecond() ); } } ===== LocalTime ===== ==== Idő tárolása ==== import java.time.LocalTime; import java.time.ZoneId; class Program01 { public static void main(String[] args) { LocalTime time = LocalTime.now(ZoneId.of("Europe/Budapest")); System.out.println(time); } } ==== Idő megadása ==== import java.time.LocalTime; class Program01 { public static void main(String[] args) { LocalTime time = LocalTime.of(12,20,25,40); System.out.println(time); } } ===== Linkek ===== * https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html