Java Language
Datumsklasse
Suche…
Syntax
-
Date object = new Date();
-
Date object = new Date(long date);
Parameter
Parameter | Erläuterung |
---|---|
Kein Parameter | Erzeugt ein neues Date-Objekt mit der Zuordnungszeit (auf die nächste Millisekunde) |
langes Datum | Erzeugt ein neues Date-Objekt mit einer auf "Millisekunden" seit "der Epoche" (1. Januar 1970, 00:00:00 GMT) eingestellten Zeit. |
Bemerkungen
Darstellung
Intern wird ein Java Date-Objekt als Long dargestellt. es ist die Anzahl der Millisekunden seit einer bestimmten Zeit (als Epoche bezeichnet ). Die ursprüngliche Java Date-Klasse verfügte über Methoden zum Umgang mit Zeitzonen usw., die jedoch zugunsten der damals neuen Calendar-Klasse verworfen wurden.
Wenn Sie also nur eine bestimmte Zeit in Ihrem Code verwenden möchten, können Sie eine Date-Klasse erstellen und speichern usw. Wenn Sie eine vom Menschen lesbare Version dieses Datums ausdrucken möchten, erstellen Sie jedoch eine Calendar-Klasse Verwenden Sie die Formatierung, um Stunden, Minuten, Sekunden, Tage, Zeitzonen usw. zu erstellen. Beachten Sie, dass eine bestimmte Millisekunde als unterschiedliche Stunden in verschiedenen Zeitzonen angezeigt wird. Normalerweise möchten Sie eine in der "lokalen" Zeitzone anzeigen, aber die Formatierungsmethoden müssen berücksichtigen, dass Sie sie möglicherweise für eine andere Zeitzone anzeigen möchten.
Beachten Sie außerdem, dass die von JVMs verwendeten Uhren normalerweise keine Millisekundengenauigkeit haben. Die Uhr kann nur alle 10 Millisekunden "ticken". Wenn Sie also die Zeit steuern, können Sie sich nicht darauf verlassen, die Dinge auf diesem Pegel genau zu messen.
Anweisung importieren
import java.util.Date;
Die Date
Klasse kann aus dem java.util
Paket importiert werden.
Vorsicht
Date
sind veränderlich, sodass die Verwendung dieser Codes das Schreiben von threadsicherem Code erschweren oder versehentlich Schreibzugriff auf den internen Status ermöglichen kann. In der untenstehenden Klasse ermöglicht die Methode getDate()
beispielsweise dem Aufrufer, das Transaktionsdatum zu ändern:
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
Die Lösung ist, entweder eine Kopie des date
oder die in Java 8 eingeführten neuen APIs in java.time
.
Die meisten Konstruktormethoden in der Date
Klasse sind veraltet und sollten nicht verwendet werden. In fast allen Fällen ist es ratsam, die Calendar
Klasse für Datumsvorgänge zu verwenden.
Java 8
Java 8 führt eine neue Zeit- und Datums-API in das Paket java.time
, einschließlich LocalDate und LocalTime . Die Klassen im Paket java.time
bieten eine überarbeitete API, die einfacher zu verwenden ist. Wenn Sie in Java 8 schreiben, wird dringend empfohlen, dass Sie diese neue API verwenden. Siehe Datum und Uhrzeit (java.time. *) .
Date-Objekte erstellen
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
Dieses Date
Objekt enthält hier das aktuelle Datum und die Uhrzeit, zu der dieses Objekt erstellt wurde.
Calendar calendar = Calendar.getInstance();
calendar.set(90, Calendar.DECEMBER, 11);
Date myBirthDate = calendar.getTime();
System.out.println(myBirthDate); // Mon Dec 31 00:00:00 IST 1990
Date
werden am besten über eine Calendar
da die Verwendung der Datenkonstruktoren veraltet und nicht empfohlen wird. Dazu benötigen wir eine Instanz der Calendar
Klasse von der Factory-Methode. Dann können Sie Jahr, Monat und Tag des Monats mithilfe von Zahlen oder im Fall von Monaten festgelegter Konstanten in der Klasse Calendar festlegen, um die Lesbarkeit zu verbessern und Fehler zu reduzieren.
calendar.set(90, Calendar.DECEMBER, 11, 8, 32, 35);
Date myBirthDatenTime = calendar.getTime();
System.out.println(myBirthDatenTime); // Mon Dec 31 08:32:35 IST 1990
Neben dem Datum können wir auch die Zeit in der Reihenfolge Stunde, Minuten und Sekunden übergeben.
Date-Objekte vergleichen
Kalender, Datum und LocalDate
vor, nach, compareTo und gleich Methoden
//Use of Calendar and Date objects
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();
final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();
//Before example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));
//After example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));
//Compare example
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));
//Equal example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
"Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));
//Clear ms from calendars
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();
System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
isBefore, isAfter, compareTo und equals Methoden
//Use of LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);
//Hours, minutes, second and nanoOfsecond can also be configured with an other class LocalDateTime
//LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
//isBefore example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));
//isAfter example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));
//compareTo example
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));
//equals example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));
//isEqual example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));
Datumsvergleich vor Java 8
Vor Java 8 konnten Datumsangaben mit den Klassen java.util.Calendar und java.util.Date verglichen werden. Datumsklasse bietet 4 Methoden zum Vergleich von Datumsangaben:
after
, before
, compareTo
und equals
Methoden , um die Werte zurückgegeben durch Vergleichen getTime () Methode für jedes Datum.
compareTo
Methode gibt eine positive ganze Zahl zurück.
- Wert größer als 0: Wenn das Datum nach dem Datumsargument liegt
- Wert größer als 0: Wenn das Datum vor dem Datumsargument liegt
- Wert gleich 0: wenn Date gleich dem Date-Argument ist
equals
Ergebnisse können, wie im Beispiel gezeigt, überraschend sein, da Werte wie Millisekunden nicht mit dem gleichen Wert initialisiert werden, wenn dies nicht ausdrücklich angegeben ist.
Seit Java 8
Mit Java 8 ist ein neues Objekt für die Arbeit mit Date java.time.LocalDate verfügbar. LocalDate
implementiert ChronoLocalDate , die abstrakte Darstellung eines Datums, an dem das Chronologie- oder Kalendersystem steckbar ist.
Um die Datumszeitgenauigkeit zu erhalten, muss das Objekt java.time.LocalDateTime verwendet werden. LocalDate
und LocalDateTime
verwenden zum Vergleich den gleichen Methodennamen.
Der Vergleich von Datumsangaben mit einem LocalDate
unterscheidet sich von der Verwendung von ChronoLocalDate
da die Chronologie oder das Kalendersystem nicht als erstes berücksichtigt werden.
Da die meisten Anwendungen LocalDate
verwenden LocalDate
, ist ChronoLocalDate
nicht in den Beispielen enthalten. Lesen Sie hier weiter .
Die meisten Anwendungen sollten Methodensignaturen, Felder und Variablen als LocalDate deklarieren, nicht diese Schnittstelle [ChronoLocalDate].
LocalDate
bietet 5 Methoden zum Vergleich von Daten:
- isAfter (ChronoLocalDate andere)
- isBefore (ChronoLocalDate andere)
- isEqual (ChronoLocalDate andere)
- compareTo (ChronoLocalDate andere)
- gleich (Objekt obj)
Im Falle des LocalDate
Parameters ist isAfter
, isBefore
, isEqual
, equals
und compareTo
nun diese Methode:
int compareTo0(LocalDate otherDate) {
int cmp = (year - otherDate.year);
if (cmp == 0) {
cmp = (month - otherDate.month);
if (cmp == 0) {
cmp = (day - otherDate.day);
}
}
return cmp;
}
equals
Methode prüft, ob die Parameterreferenz dem Datum zuerst entspricht, während isEqual
direkt compareTo0
Bei einer anderen Klasseninstanz von ChronoLocalDate
die Datumsangaben anhand des Epoch Day
verglichen. Die Epochen-Tageszählung ist eine einfache Erhöhung der Anzahl von Tagen, an denen Tag 0 1970-01-01 (ISO) ist.
Datum in ein bestimmtes String-Format konvertieren
format()
aus der SimpleDateFormat
Klasse hilft beim Konvertieren eines Date
Objekts in ein bestimmtes Format- String
Objekt mithilfe der angegebenen Musterzeichenfolge .
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
Muster können mit applyPattern()
erneut angewendet werden
dateFormat.applyPattern("dd-MM-yyyy");
System.out.println(dateFormat.format(today)); //25-02-2016
dateFormat.applyPattern("dd-MM-yyyy HH:mm:ss E");
System.out.println(dateFormat.format(today)); //25-02-2016 06:14:33 Thu
Hinweis: Hier steht mm
(kleiner Buchstabe m) für Minuten und MM
(Großbuchstabe M) für Monat. Achten Sie besonders bei der Formatierung Jahre: Kapital „Y“ ( Y
) gibt die „Woche im Jahr“ , während Klein „y“ ( y
) das Jahr angibt.
String in Datum konvertieren
SimpleDateFormat
parse()
aus der SimpleDateFormat
Klasse hilft beim Konvertieren eines String
Musters in ein Date
Objekt.
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String dateStr = "02/25/2016"; // input String
Date date = dateFormat.parse(dateStr);
System.out.println(date.getYear()); // 116
Es gibt 4 verschiedene Formatvorlagen für das Textformat: SHORT
, MEDIUM
(Standardeinstellung), LONG
und FULL
, die jeweils vom Gebietsschema abhängen. Wenn kein Gebietsschema angegeben ist, wird das Systemgebietsschema verwendet.
Stil | Locale.US | Locale.France |
---|---|---|
KURZ | 30.6.09 | 30/06/09 |
MITTEL | 30. Juni 2009 | 30. Juni 2009 |
LANGE | 30. Juni 2009 | 30. Juni 2009 |
VOLL | Dienstag, 30. Juni 2009 | 30. Juni 2009 |
Eine grundlegende Datumsausgabe
Wenn Sie den folgenden Code mit dem Formatstring yyyy/MM/dd hh:mm.ss
, erhalten Sie die folgende Ausgabe
2016/04/19 11: 45.36
// define the format to use
String formatString = "yyyy/MM/dd hh:mm.ss";
// get a current date object
Date date = Calendar.getInstance().getTime();
// create the formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatString);
// format the date
String formattedDate = simpleDateFormat.format(date);
// print it
System.out.println(formattedDate);
// single-line version of all above code
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm.ss").format(Calendar.getInstance().getTime()));
Konvertieren Sie die formatierte Zeichenfolgendarstellung des Datums in das Date-Objekt
Mit dieser Methode kann eine formatierte Zeichenfolgendarstellung eines Datums in ein Date
Objekt konvertiert werden.
/**
* Parses the date using the given format.
*
* @param formattedDate the formatted date string
* @param dateFormat the date format which was used to create the string.
* @return the date
*/
public static Date parseDate(String formattedDate, String dateFormat) {
Date date = null;
SimpleDateFormat objDf = new SimpleDateFormat(dateFormat);
try {
date = objDf.parse(formattedDate);
} catch (ParseException e) {
// Do what ever needs to be done with exception.
}
return date;
}
Ein bestimmtes Datum erstellen
Während die Java Date-Klasse mehrere Konstruktoren hat, werden Sie feststellen, dass die meisten veraltet sind. Die einzige akzeptable Methode zum direkten Erstellen einer Date-Instanz ist entweder die Verwendung des leeren Konstruktors oder die Übergabe eines langen Zeitraums (Anzahl Millisekunden seit Standardzeit). Beides ist nicht praktisch, es sei denn, Sie suchen nach dem aktuellen Datum oder haben bereits eine andere Datumsinstanz in der Hand.
Um ein neues Datum zu erstellen, benötigen Sie eine Kalenderinstanz. Von dort aus können Sie die Kalenderinstanz auf das gewünschte Datum einstellen.
Calendar c = Calendar.getInstance();
Dadurch wird eine neue Kalenderinstanz auf die aktuelle Uhrzeit zurückgegeben. Kalender verfügt über viele Methoden, um Datum und Uhrzeit zu ändern oder ganz einfach einzustellen. In diesem Fall setzen wir es auf ein bestimmtes Datum.
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
Die getTime
Methode gibt die Date-Instanz zurück, die wir benötigen. Beachten Sie, dass mit den Kalendersatzmethoden nur ein oder mehrere Felder festgelegt werden, sie jedoch nicht alle. Das heißt, wenn Sie das Jahr einstellen, bleiben die anderen Felder unverändert.
FALLE
In vielen Fällen erfüllt dieses Code-Snippet seinen Zweck. Beachten Sie jedoch, dass zwei wichtige Teile des Datums / der Uhrzeit nicht definiert sind.
- Die Parameter
(1974, 6, 2, 8, 0, 0)
werden innerhalb der an anderer Stelle definierten Standardzeitzone interpretiert. - Die Millisekunden werden nicht auf Null gesetzt, sondern zum Zeitpunkt der Erstellung der Kalenderinstanz von der Systemuhr aufgefüllt.
Java 8 LocalDate- und LocalDateTime-Objekte
Date- und LocalDate-Objekte können nicht genau miteinander konvertiert werden, da ein Date-Objekt einen bestimmten Tag und eine bestimmte Uhrzeit darstellt, während ein LocalDate-Objekt keine Zeit- oder Zeitzoneninformationen enthält. Es kann jedoch nützlich sein, zwischen den beiden zu konvertieren, wenn Sie nur die tatsächlichen Datumsinformationen und nicht die Zeitangaben berücksichtigen.
Erzeugt ein LocalDate
// Create a default date
LocalDate lDate = LocalDate.now();
// Creates a date from values
lDate = LocalDate.of(2017, 12, 15);
// create a date from string
lDate = LocalDate.parse("2017-12-15");
// creates a date from zone
LocalDate.now(ZoneId.systemDefault());
Erzeugt eine LocalDateTime
// Create a default date time
LocalDateTime lDateTime = LocalDateTime.now();
// Creates a date time from values
lDateTime = LocalDateTime.of(2017, 12, 15, 11, 30);
// create a date time from string
lDateTime = LocalDateTime.parse("2017-12-05T11:30:30");
// create a date time from zone
LocalDateTime.now(ZoneId.systemDefault());
LocalDate to Date und umgekehrt
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDate
LocalDate localDate = date.toInstant().atZone(defaultZoneId).toLocalDate();
// LocalDate to Date
Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
LocalDateTime to Date und umgekehrt
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(defaultZoneId).toLocalDateTime();
// LocalDateTime to Date
Date out = Date.from(localDateTime.atZone(defaultZoneId).toInstant());
Zeitzonen und java.util.Date
Ein java.util.Date
Objekt verfügt nicht über ein Konzept der Zeitzone.
- Es gibt keine Möglichkeit , eine Zeitzone für ein Datum festlegen
- Es ist nicht möglich, die Zeitzone eines Date-Objekts zu ändern
- Ein Date-Objekt, das mit dem
new Date()
Standardkonstruktornew Date()
wird mit der aktuellen Uhrzeit in der Standardzeitzone des Systems initialisiert
Es ist jedoch möglich, das durch den Date-Objekt beschriebene Datum in einer anderen Zeitzone java.text.SimpleDateFormat
, z. B. mit java.text.SimpleDateFormat
:
Date date = new Date();
//print default time zone
System.out.println(TimeZone.getDefault().getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //note: time zone not in format!
//print date in the original time zone
System.out.println(sdf.format(date));
//current time in London
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));
Ausgabe:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
Konvertieren Sie java.util.Date in java.sql.Date
java.sql.Date
Konvertierung von java.util.Date
in java.sql.Date
ist normalerweise erforderlich, wenn ein Date-Objekt in eine Datenbank geschrieben werden muss.
java.sql.Date
ist ein Wrapper um den Millisekundenwert und wird von JDBC
zur Identifizierung eines SQL DATE
Typs verwendet
Im folgenden Beispiel verwenden wir den Konstruktor java.util.Date()
, der ein Date-Objekt erstellt und es initialisiert, um die Zeit auf die nächste Millisekunde darzustellen. Dieses Datum wird in der convert(java.util.Date utilDate)
-Methode verwendet, um ein java.sql.Date
Objekt zurückzugeben
Beispiel
public class UtilToSqlConversion {
public static void main(String args[])
{
java.util.Date utilDate = new java.util.Date();
System.out.println("java.util.Date is : " + utilDate);
java.sql.Date sqlDate = convert(utilDate);
System.out.println("java.sql.Date is : " + sqlDate);
DateFormat df = new SimpleDateFormat("dd/MM/YYYY - hh:mm:ss");
System.out.println("dateFormated date is : " + df.format(utilDate));
}
private static java.sql.Date convert(java.util.Date uDate) {
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
return sDate;
}
}
Ausgabe
java.util.Date is : Fri Jul 22 14:40:35 IST 2016
java.sql.Date is : 2016-07-22
dateFormated date is : 22/07/2016 - 02:40:35
java.util.Date
enthält sowohl Datums- als auch Zeitinformationen, wohingegen java.sql.Date
nur java.sql.Date
enthält
Ortszeit
Um nur den Zeitteil eines Datums zu verwenden, verwenden Sie LocalTime. Sie können ein LocalTime-Objekt auf mehrere Arten instanziieren
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
verfügt außerdem über eine integrierte toString-Methode, die das Format sehr gut anzeigt.
System.out.println(time);
Sie können Stunden, Minuten, Sekunden und Nanosekunden auch vom LocalTime-Objekt abrufen, addieren und subtrahieren
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
Sie können es mit dem folgenden Code in ein Date-Objekt umwandeln:
LocalTime lTime = LocalTime.now();
Instant instant = lTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
Diese Klasse funktioniert sehr gut innerhalb einer Timer-Klasse, um einen Wecker zu simulieren.