[[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