Was ist der beste Weg, um ein String
im Format '2. Januar 2010' in ein Date
in Java zu konvertieren ?
Letztendlich möchte ich den Monat, den Tag und das Jahr als ganze Zahlen aufteilen, damit ich sie verwenden kann
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
um das Datum in die Zeit umzuwandeln.
Date
sind veraltet.java.util.Date
,java.util.Calendar
undjava.text.SimpleTextFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen. Siehe Tutorial von Oracle .Antworten:
Das ist der harte Weg, und diese
java.util.Date
Setter-Methoden sind seit Java 1.1 (1997) veraltet. Formatieren Sie das Datum einfachSimpleDateFormat
mit einem Formatmuster, das mit der Eingabezeichenfolge übereinstimmt .In Ihrem speziellen Fall von "2. Januar 2010" als Eingabezeichenfolge:
MMMM
Muster dafürd
Muster dafür.yyyy
Muster dafür.Beachten Sie die Wichtigkeit des expliziten
Locale
Arguments. Wenn Sie es weglassen, wird das Standardgebietsschema verwendet, das nicht unbedingt Englisch ist, wie im Monatsnamen der Eingabezeichenfolge verwendet. Wenn das Gebietsschema nicht mit der Eingabezeichenfolge übereinstimmt, erhalten Sie verwirrenderweise einejava.text.ParseException
, obwohl das Formatmuster gültig erscheint.Hier ist ein relevanter Auszug aus dem Javadoc , in dem alle verfügbaren Formatmuster aufgelistet sind:
Beachten Sie, dass bei den Mustern zwischen Groß- und Kleinschreibung unterschieden wird und dass textbasierte Muster mit vier oder mehr Zeichen die vollständige Form darstellen. Andernfalls wird eine kurze oder abgekürzte Form verwendet, sofern verfügbar. Also zB
MMMMM
oder mehr ist unnötig.Hier sind einige Beispiele für gültige
SimpleDateFormat
Muster zum Parsen einer bestimmten Zeichenfolge bis heute:Ein wichtiger Hinweis ist , dass
SimpleDateFormat
ist nicht Thread - sicher. Mit anderen Worten, Sie sollten es niemals als statische oder Instanzvariable deklarieren und zuweisen und es dann aus verschiedenen Methoden / Threads wiederverwenden. Sie sollten es immer brandneu im lokalen Bereich der Methode erstellen.Java 8 Update
Wenn Sie sich unter Java 8 oder höher befinden, verwenden Sie
DateTimeFormatter
(klicken Sie auch hier auf den Link, um alle vordefinierten Formatierer und verfügbaren Formatmuster anzuzeigen. Das Lernprogramm finden Sie hier ). Diese neue API ist von JodaTime inspiriert .Hinweis: Wenn Ihr Formatmuster auch den Zeitteil enthält, verwenden Sie
LocalDateTime#parse(text, formatter)
anstelle vonLocalDate#parse(text, formatter)
. Wenn Ihr Formatmuster zufällig auch die Zeitzone enthält, verwenden SieZonedDateTime#parse(text, formatter)
stattdessen.Hier ist ein relevanter Auszug aus dem Javadoc , in dem alle verfügbaren Formatmuster aufgelistet sind:
Beachten Sie, dass es mehrere vordefinierte Formatierer für die gängigsten Muster gibt. Also statt zB
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
könnten Sie verwendenDateTimeFormatter.RFC_1123_DATE_TIME
. Dies ist möglich, weil sie im Gegensatz dazuSimpleDateFormat
threadsicher sind. Sie können also bei Bedarf auch Ihre eigenen definieren.Für ein bestimmtes Eingabezeichenfolgenformat müssen Sie kein explizites Format verwenden
DateTimeFormatter
: Ein Standarddatum nach ISO 8601 , wie z. B. 2016-09-26T17: 44: 57Z, kann direkt analysiert werden,LocalDateTime#parse(text)
da es bereits denISO_LOCAL_DATE_TIME
Formatierer verwendet. In ähnlicher Weise wirdLocalDate#parse(text)
ein ISO-Datum ohne die Zeitkomponente analysiert (sieheISO_LOCAL_DATE
) undZonedDateTime#parse(text)
ein ISO-Datum mit einem hinzugefügten Versatz und einer hinzugefügten Zeitzone (sieheISO_ZONED_DATE_TIME
).quelle
O
, wie lassen sie druckenUTC+08:00
stattGMT+08:00
. Ich konnte kein Beispiel bekommen.20-JUN-16 12.00.00.000000000 AM
, brauche Hilfe, um diese in Datum umzuwandeln. Deine Hilfe ist sehr Willkommen!!Ach ja, wieder die Java Date Diskussion. Für die Datumsmanipulation verwenden wir Date , Calendar , GregorianCalendar und SimpleDateFormat . Verwenden Sie beispielsweise Ihr Januar-Datum als Eingabe:
Dann können Sie das mit etwas manipulieren wie:
quelle
quelle
Mit Java 8 erhalten wir eine neue Datums- / Uhrzeit-API ( JSR 310 ).
Die folgende Methode kann verwendet werden, um das Datum in Java 8 zu analysieren, ohne sich auf Joda-Time zu verlassen :
LocalDate ist die Standard-Java 8-Klasse zur Darstellung eines Datums (ohne Uhrzeit). Wenn Sie Werte analysieren möchten, die Datums- und Uhrzeitinformationen enthalten, sollten Sie LocalDateTime verwenden . Verwenden Sie für Werte mit Zeitzonen ZonedDateTime . Beide bieten eine
parse()
ähnliche Methode wieLocalDate
:Die Liste der Formatierungszeichen aus DateTimeFormatter Javadoc :
quelle
Einige der Antworten sind zwar technisch korrekt, aber nicht ratsam.
Diese beliebte kostenlose Open-Source-Bibliothek kann für mehrere Java-Versionen verwendet werden. Viele Beispiele für seine Verwendung finden Sie in StackOverflow. Wenn Sie einige davon lesen, werden Sie schnell auf den neuesten Stand gebracht.
Diese neuen Klassen sind von Joda-Time inspiriert und von JSR 310 definiert. Diese Klassen sind in Java 8 integriert. Derzeit läuft ein Projekt, um diese Klassen auf Java 7 zurück zu portieren, aber diese Backportierung wird nicht von unterstützt Orakel.
Datum hat sowohl einen Datumsanteil als auch einen Tageszeitanteil.
Der Beginn eines Tages hängt von der Zeitzone ab. Wenn Sie keine Zeitzone angeben, wird die Standardzeitzone der JVM angewendet. Das bedeutet, dass sich das Verhalten Ihres Codes ändern kann, wenn er auf anderen Computern oder mit einer geänderten Zeitzoneneinstellung ausgeführt wird. Wahrscheinlich nicht das, was du willst.
Die Sprache des Gebietsschemas gibt an, wie die Wörter (Name des Monats und des Tages) zu interpretieren sind, die beim Parsen auftreten. (Die Antwort von BalusC behandelt dies ordnungsgemäß.) Das Gebietsschema wirkt sich auch auf die Ausgabe einiger Formatierer aus, wenn eine Zeichenfolgendarstellung Ihrer Datums- und Uhrzeitangabe erstellt wird.
Joda-Zeit
Es folgen einige Anmerkungen zur Joda-Zeit.
Zeitzone
In Joda-Time kennt ein DateTime- Objekt seine eigene zugewiesene Zeitzone. Dies steht im Gegensatz zur Klasse java.util.Date , die eine Zeitzone zu haben scheint , dies aber nicht tut.
Beachten Sie im folgenden Beispielcode, wie wir ein Zeitzonenobjekt an den Formatierer übergeben, der die Zeichenfolge analysiert. Diese Zeitzone wird verwendet, um diese Datums- und Uhrzeitangabe als in dieser Zeitzone aufgetreten zu interpretieren. Sie müssen also über die Zeitzone nachdenken und diese bestimmen, die durch diese Zeichenfolgeneingabe dargestellt wird.
Da Ihre Eingabezeichenfolge keinen Zeitanteil enthält, weist Joda-Time den ersten Moment des Tages der angegebenen Zeitzone als Tageszeit zu. Normalerweise bedeutet dies,
00:00:00
aber nicht immer, aufgrund der Sommerzeit (DST) oder anderer Anomalien. Übrigens können Sie mit jeder DateTime-Instanz dasselbe tun, indem Sie aufrufenwithTimeAtStartOfDay
.Formatierungsmuster
Die im Muster eines Formatierers verwendeten Zeichen ähneln in Joda-Time denen in java.util.Date/Calendar, sind jedoch nicht genau gleich. Lesen Sie das Dokument sorgfältig durch.
Unveränderlichkeit
Wir verwenden normalerweise die unveränderlichen Klassen in Joda-Time. Anstatt ein vorhandenes Datum / Uhrzeit-Objekt zu ändern, rufen wir Methoden auf, die eine neue neue Instanz basierend auf dem anderen Objekt erstellen, wobei die meisten Aspekte kopiert werden, außer wenn Änderungen gewünscht wurden. Ein Beispiel ist der Aufruf
withZone
in der letzten Zeile unten. Unveränderlichkeit trägt dazu bei, Joda-Time sehr threadsicher zu machen, und kann auch einige Arbeiten klarer machen.Umwandlung
Sie benötigen java.util.Date-Objekte zur Verwendung mit anderen Klassen / Frameworks, die keine Kenntnisse über Joda-Time-Objekte haben. Glücklicherweise ist es sehr einfach, sich hin und her zu bewegen.
Von einem java.util.Date-Objekt (hier benannt
date
) zu Joda-Time DateTime wechseln…Von Joda-Time in die andere Richtung zu einem java.util.Date-Objekt gehen…
Beispielcode
Beim Laufen…
quelle
Beachten Sie beim Umgang mit der SimpleDateFormat-Klasse, dass Date nicht threadsicher ist und Sie ein einzelnes Date-Objekt nicht für mehrere Threads freigeben können.
Es gibt auch einen großen Unterschied zwischen "m" und "M", wo ein kleiner Fall für Minuten und ein Großbuchstabe für einen Monat verwendet wird. Das gleiche gilt für "d" und "D". Dies kann subtile Fehler verursachen, die oft übersehen werden. Weitere Informationen finden Sie unter Javadoc oder Anleitung zum Konvertieren von Zeichenfolgen in Datumsangaben in Java .
quelle
Es funktioniert gut für mich.
quelle
Sie können SimpleDateformat verwenden, um die Zeichenfolge auf das Datum zu ändern
quelle
Außerdem ist SimpleDateFormat mit einigen clientseitigen Technologien wie GWT nicht verfügbar .
Es ist eine gute Idee, sich für Calendar.getInstance () zu entscheiden, und Sie müssen zwei Daten vergleichen. für ein langes Date gehen.
quelle
Einfache zwei Formatierer, die wir verwendet haben:
Wir analysieren das vollständige Format von Datum zu Uhrzeit:
quelle
Mein bescheidenes Testprogramm. Ich benutze es, um mit dem Formatierer herumzuspielen und lange Daten nachzuschlagen, die ich in Protokolldateien finde (aber wer hat sie dort abgelegt ...).
Mein Testprogramm:
Testergebnisse:
quelle
Quelle Link -
Für Android
Calendar.getInstance (). GetTime () gibt
Verwenden
quelle
Konvertierung von Zeichenfolge in Datum:
quelle
Versuche dies
quelle