Wie erhalte ich den aktuellen Moment im ISO 8601-Format mit Datum, Stunde und Minute?

322

Was ist der eleganteste Weg, um eine ISO 8601- formatierte Darstellung des aktuellen Moments UTC zu erhalten? Es sollte so aussehen:2010-10-12T08:50Z .

Beispiel:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
yegor256
quelle
5
@marcolopes Achtung, dass die Verwendung von a private static SimpleDateFormatnicht threadsicher ist.
vegemite4me
Ähnlich wie bei dieser anderen Frage , aber diese Frage wird auf die ganze Sekunde gekürzt, während diese Frage auf die ganze Minute gekürzt wird.
Basil Bourque

Antworten:

290

Verwenden Sie SimpleDateFormatdiese Option, um ein beliebiges DateObjekt zu formatieren :

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

Wenn Sie a new Date()wie oben gezeigt verwenden, wird die aktuelle Uhrzeit formatiert.

Joachim Sauer
quelle
8
@ Joachim Die negative Seite dieses "Standard" -Ansatzes ist, dass ich "yyyy-MM-dd'T'HH:mmZ"jedes Mal, wenn ich ein ISO-8601-formatiertes Datum benötige, viele Instanzen in meiner Anwendung haben muss. Wie ich sehe, kann ich mit JodaTime einen vordefinierten Formatierer verwenden ISODateTimeFormat, der diese Aufgabe für mich
erledigt
8
@Joachim, Zist ein gültiges Muster in SimpleDateFormat yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi
33
-1 Hier erhalten Sie Datum und Uhrzeit in der aktuellen Zeitzone - nicht UTC. Carlos 'Antwort enthält den erforderlichen UTC-Code.
Scott Rippey
16
Ich habe gerade den Zeitzonenfehler behoben - da dies die akzeptierte Antwort ist, denke ich, dass es das Richtige war.
BoD
2
Das Z muss wie folgt zitiert werden: "JJJJ-MM-TT'T'HH: MM'Z '"
Kimball Robinson
224

Für Systeme, bei denen die Standardzeitzone nicht UTC ist:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

Das SimpleDateFormat Instanz kann bei Bedarf häufig als globale Konstante deklariert werden. Beachten Sie jedoch, dass diese Klasse nicht threadsicher ist. Es muss synchronisiert werden, wenn mehrere Threads gleichzeitig darauf zugreifen.

EDIT: Ich würde Joda Time bevorzugen, wenn ich viele verschiedene Zeit- /
Datumsmanipulationen mache ... EDIT2: korrigiert: setTimeZoneakzeptiert keinen String (korrigiert von Paul)

user85421
quelle
9
Dieses Format ist in keiner eingebauten Bibliothek eine Konstante?
Daniel Kaplan
Es gibt zwei verschiedene Pakete für 'DateFormat'. Denken Sie daran, 'import java.text.DateFormat' zu verwenden
oabarca
3
Wenn Sie die aktuelle Zeitzone möchten, verwenden Sie TimeZone tz = TimeZone.getDefault (); stattdessen
Oabarca
Sie sollen nicht den ‚Z‘ im Format zitieren da , dass es logisch bedeutungslos machen. Wenn die Zeitzone wie im obigen Beispiel UTC ist, führt ein nicht zitiertes Z nur zu einem Z in der Ausgabe. Wenn die Zeitzone jedoch nicht UTC ist, wird das Z weiterhin als Literal ausgegeben, das UTC impliziert, wenn die Zeit dies möglicherweise nicht tut Sein. Wenn ein konsumierendes System das Z als UTC liest, die Zeit jedoch nicht ist, wird die Zeit verschoben. Wenn umgekehrt ein Parser das angegebene Z verwendet, ohne die Zeitzone festzulegen, analysiert er die UTC-Zeiten als Ortszeiten (erneutes Verschieben). Dieses Zitat wird nicht benötigt, wenn die TZ eingestellt ist, ist aber gefährlich, wenn dies nicht der Fall ist.
Matt Whipple
@ MattWhipple - aber wenn Sie ein nicht zitiertes Z verwenden, wird das Ergebnis so etwas wie 2016-06-14T13:56+0000- die Frage fragt nach so etwas wie2016-06-14T13:56Z
user85421
183

Java 8 Native

java.time macht es einfach seit Java 8. Und thread sicher.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

Ergebnis: 2015-04-14T11:07:36.639Z

Sie könnten versucht sein, Feuerzeuge Temporalwie Instantoder zu verwenden LocalDateTime, aber es fehlt ihnen an Formatierungsunterstützung oder Zeitzonendaten. Funktioniert nur ZonedDateTimesofort.

Durch Optimieren oder Verketten der Optionen / Vorgänge von ZonedDateTime und DateTimeFormatter können Sie die Zeitzone und Genauigkeit bis zu einem gewissen Grad einfach steuern :

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Ergebnis: 2015-04-14T11:07:00+01:00[Europe/Paris]

Verfeinerte Anforderungen, wie das Entfernen des Sekunden-Teils, müssen weiterhin von benutzerdefinierten Formaten oder benutzerdefinierten Nachbearbeitungsprozessen erfüllt werden.

.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07

Für Java 6 und 7 können Sie Back-Ports von java.time in Betracht ziehen , z. B. ThreeTen-Backport , das auch über einen Android-Port verfügt . Beide sind leichter als Joda und haben aus Jodas Erfahrung gelernt - insb. wenn man bedenkt, dass java.time von Jodas Autor entworfen wurde.

Schafig
quelle
9
Gute Antwort. Beachten Sie die gute Angewohnheit , eine Zeitzone explizit anzugeben, anstatt sich implizit auf die aktuelle Standardzeitzone der JVM zu verlassen. Falls gewünscht, können Sie eine bestimmte Zeitzone angeben , z ZoneId.of( "America/Montreal" ).
Basil Bourque
1
Instant ermöglicht das Formatieren im ISO 8601-Format durch einfaches Aufrufen der .toString () -Methode:return DateTimeFormatter.ISO_INSTANT.format(this);
VadymVL
Dies ist am besten, weil Sie die Standardeinstellung vermeiden.
Christophe Roussy
6
Warnung: Die Lösung für Java 8 mit ISO_INSTANT hat eine nervige Eigenart. Wenn die Millisekunden zufällig 0 sind, sind sie nicht in der Ausgabe enthalten. Dies ist gemäß der Norm ISO 8601 zulässig, aber viele Bibliotheken und Parser in anderen Sprachen sind nicht so verzeihend. Wenn immer die Nullen eingeschlossen werden müssen, verwenden Sie stattdessen Folgendes: DateTimeFormatter ISO_8601 = ofPattern ("JJJJ-MM-TT'T'HH: mm: ss.SSSX"). WithZone (UTC);
Jürgen
Nach dem Wechsel von Java 8 zu 11 sehe DateTimeFormatter.ISO_INSTANTund DateTimeFormatter.ISO_DATE_TIMEverwende ich nach den Sekunden 6 Ziffern, im Gegensatz zu 3, die von Spring's nicht mehr erfasst werden @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
DanielM
126

Java 8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());

Vor Java 8:

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

Aus den Dokumenten :

'R'    Zeit formatiert für die 24-Stunden-Uhr als "% tH:% tM"
'F'    ISO 8601 vollständiges Datum formatiert als "% tY-% tm-% td".

aioobe
quelle
26
Nun, entweder fügen Sie eine zusätzliche Bibliothek eines Drittanbieters als Abhängigkeit von Ihrem Projekt hinzu (die Sie möglicherweise auf dem neuesten Stand halten und mit Ihrer Anwendung ausliefern möchten, hey, es sind nur zusätzliche 3,2 Megabyte) und tun dies DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);, oder Sie kapseln return String.format("%tFT%<tRZ", new Date());in eine Klasse und tun str = Iso8601Time.now(), wo immer Sie es brauchen. (Es ist nicht so, dass sich das ISO-Format ändern wird.) Wenn sich herausstellt, dass Sie mehr als nur das aktuelle Datum im ISO-Format benötigen, verwenden Sie eine Bibliothek.
Aioobe
2
Stimme dem voll und ganz zu.
yegor256
3
Beachten Sie, dass es möglich ist zu ändern, welche Antwort als akzeptiert markiert ist
;-)
8
%tFT%<tTZwird Sekunden enthalten; %tFT%<tTZ.%<tLwird Millisekunden enthalten.
Patrick Linskey
2
Eine sehr nette Lösung, sollte die akzeptierte Antwort jetzt sein :)
AbdelHady
93

Ab Java 8 können Sie einfach:

Instant.now().toString();

Aus den java.time.InstantDokumenten:

jetzt

public static Instant now()

Ruft den aktuellen Zeitpunkt von der Systemuhr ab.

Dadurch wird die UTC-Uhr des Systems abgefragt , um den aktuellen Zeitpunkt zu erhalten.

 


public String toString()

Eine Zeichenfolgendarstellung dieses Augenblicks unter Verwendung der ISO-8601-Darstellung.

Das verwendete Format ist das gleiche wie DateTimeFormatter.ISO_INSTANT.

Владимир Зайцев
quelle
11
Dies ist die richtige Antwort, und es ist ein Skandal, dass es in all diesen Zusammenstellungen nicht höher bewertet wurde SimpleDateFormats.
David Moles
Ich bin froh, dass ich mehr Antworten gelesen habe. Ich stimme zu, dies sollte jetzt die Antwort sein.
Xan-Kun Clark-Davis
Und weil es so ist toString, müssen Sie es in vielen Fällen nicht einmal explizit aufrufen.
kaya3
1
Warnung in einem Kommentar zu einer früheren Antwort gilt auch hier: "Warnung: Die Lösung für Java 8 mit ISO_INSTANT hat eine nervige Eigenart. Wenn die Millisekunden zufällig 0 sind, werden sie nicht in die Ausgabe aufgenommen. Dies ist gemäß ISO 8601 zulässig Standard, aber viele Bibliotheken und Parser in anderen Sprachen sind nicht so verzeihend. "
Dave L.
27

benutze JodaTime

Das Kalendersystem ISO 8601 ist die Standardimplementierung in Joda-Time

Hier ist das Dokument für JodaTime Formatter

Bearbeiten:

Wenn Sie nicht hinzufügen möchten oder wenn Sie keinen Wert für das Hinzufügen der obigen Bibliothek sehen, können Sie SimpleDateFormatdas Datum einfach in der erstellten Klasse verwenden, um es auf das erforderliche ISO-Format zu formatieren

wie von @Joachim Sauer vorgeschlagen

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
Jigar Joshi
quelle
3
Und wie würden Sie einen String erzeugen, der wie in der Frage gezeigt formatiert ist?
Joachim Sauer
4
Ich würde sagen, füge keine Bibliotheksabhängigkeit für so etwas Einfaches hinzu (was mit zwei Zeilen Java-Code erreicht werden kann). (Sicher, wenn die Anforderungen wachsen, ist es eine andere Geschichte.)
Aioobe
1
@aioobe, wenn es nur in mehreren Teilen der App verwendet wird, ist es in Ordnung, die Standardeinstellung zu verwenden, im Rest ist Jodatime besser.
Jigar Joshi
5
@aioobe jodatime ist auf jeden Fall besser, weil es ISODateTimeFormat- einen vordefinierten Formatierer von ISO-8601 hat.
yegor256
3
@ org.life.java: Diese sind nur relevant, wenn Sie ordnungsgemäß zur Jode-Zeit wechseln können. Sie werden sie nicht haben, wenn Sie nur diese Funktion der Joda-Zeit verwenden.
Joachim Sauer
20

DateFormatUtils von Apache commons-lang3haben nützliche Konstanten, zum Beispiel:DateFormatUtils.ISO_DATETIME_FORMAT

yegor256
quelle
3
Genauer gesagt, der aktuelle Moment in UTC: DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));aktueller Moment in der Standardzeitzone : DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256 danke für die Erwähnung DateFormatUtils, mit Apache commons-lang an Bord lohnt es sich, das Datumsformat zu verwenden.
Babinik
19

Wenn Sie Jodatime nicht einschließen möchten (so schön wie es ist)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

Dies gibt eine Zeichenfolge von:

2012-07-10T16:02:48.440Z

Dies unterscheidet sich geringfügig von der ursprünglichen Anforderung, ist jedoch immer noch ISO-8601.

Matthew Buckett
quelle
10

Joda-Zeit

Update: Das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Informationen zu Java 6 und 7 finden Sie im ThreeTen-Backport- Projekt, das im ThreeTenABP für Android weiter angepasst wurde Projekt.

Verwenden der Joda-Time- Bibliothek…

String output = new DateTime( DateTimeZone.UTC ).toString() ;

Dies ist threadsicher. Joda-Time schafft neue unveränderliche Objekte anstatt vorhandene Objekte zu ändern.

Wenn Sie wirklich nach einem Format ohne Sekunden fragen möchten, das in Minuten aufgelöst wird, verwenden Sie einen der vielen anderen in Joda-Time integrierten Formatierer.

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;

java.time

Für Java 8 und höher funktioniert Joda-Time weiterhin. Aber die eingebaute java.time Framework ersetzt jedoch Joda-Time. Migrieren Sie also Ihren Code so schnell wie möglich von Joda-Time zu java.time.

Siehe meine andere Antwort für eine moderne Lösung.


Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, &SimpleDateFormat .

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration auf java.time Klassen .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .

Basil Bourque
quelle
7

Für Java Version 7

Sie können der Oracle-Dokumentation folgen: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

X - wird für die Zeitzone ISO 8601 verwendet

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

System.out.println(nowAsISO);

DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);

System.out.println(finalResult);
d.danailov
quelle
5

Sie können Java SimpleDateFormat mit dem folgenden Muster yyyy-MM-dd'T'HH:mm:ssXXXfür ISO 8601 verwenden.

Beispielcode: (listet alle verfügbaren Zeitzonen auf)

for (String timeZone : TimeZone.getAvailableIDs())
{
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
    dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
    String formatted = dateFormat.format(new Date());
    System.out.print(formatted);

    if (formatted.endsWith("Z"))
    {
        // These time zone's have offset of '0' from GMT.
        System.out.print("\t(" + timeZone + ")");
    }

    System.out.println();
}

Du könntest benutzen:

TimeZone.getDefault ()

für die Standard-VM-Zeitzone. Mehr hier

Möglicherweise bemerken Sie die Datums- und Uhrzeitangabe für einige Zeitzonen, die mit enden 'Z'. Diese Zeitzonen haben einen Versatz von'0' von GMT.

Weitere Infos finden Sie hier .

always_a_rookie_to_learn
quelle
5

Ich glaube, der einfachste Weg ist, zuerst zum Instant und dann zum String zu gehen wie:

String d = new Date().toInstant().toString();

Was dazu führen wird:

2017-09-08T12:56:45.331Z

Tuncay Göncüoğlu
quelle
4
Wenn Sie die aktuelle Uhrzeit anzeigen möchten, müssen Sie kein altmodisches DateObjekt durchgehen . Tu es einfach Instant.now().toString(). Wenn Sie eine Datevon einer Legacy-API erhalten haben, ist Ihre Methode die beste.
Ole VV
Als Ole VV kommentierte die lästigen alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatist jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque
5

tl; dr

Einige der anderen Antworten empfehlen Java.time- Klassen korrekt, verwenden jedoch unnötige Längen für Ihre spezifischen Anforderungen.

Instant.now()                               // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
       .truncatedTo( ChronoUnit.MINUTES )   // Lop off any seconds or fractional second, to get a value in whole minutes.
       .toString()                          // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.

2018-01-23T12: 34Z

Instant::toString

Die jav.time.InstantKlasse repräsentiert einen Moment in UTC, immer in UTC.

Instant instant = Instant.now() ;

instant.toString (): 2018-01-23T12: 34: 56.123456Z

Die Zam Ende Ihrer Beispielzeichenfolge 2010-10-12T08:50Zwird "Zulu" ausgesprochen und bedeutet UTC .

Ihr gewünschtes Format entspricht zufällig der Norm ISO 8601 . Die java.time- Klassen verwenden diese Standardformate standardmäßig beim Parsen / Generieren von Zeichenfolgen. Sie müssen also kein Formatierungsmuster angeben. Ruf einfach anInstant::toString wie oben gezeigt an.

Wenn Sie speziell ganze Minuten ohne Sekunde oder Sekundenbruchteil möchten, schneiden Sie diese ab. Geben Sie eine Zeiteinheit über die ChronoUnitKlasse an.

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.

Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, &SimpleDateFormat .

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration auf java.time Klassen .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .

Basil Bourque
quelle
2

Hier ist eine ganze Klasse, die so optimiert ist, dass das Aufrufen von "now ()" nichts mehr bewirkt, als es zu tun hat.

public class Iso8601Util
{
    private static TimeZone tz = TimeZone.getTimeZone("UTC");
    private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");

    static
    {
        df.setTimeZone(tz);
    }

    public static String now()
    {
        return df.format(new Date());
    }
}
gilbertpilz
quelle
9
Das statische Erstellen kann zu Problemen führen, da SimpleDateFormat nicht threadsicher ist: "Datumsformate werden nicht synchronisiert. Es wird empfohlen, separate Formatinstanzen für jeden Thread zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden." docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki
2
Wie @Juha Palomäki erwähnte, ist dies nicht threadsicher. Wenn Sie Java 8 oder höher verwenden, kann ThreadLocal.withInitial dies beheben. Wenn Sie Java 7 oder niedriger verwenden, erstellen Sie ein neues ThreadLocal und geben Sie einen Anfangswert an, indem Sie ThreadLocal.initialValue
user393274 vom
@ user393274 - wenn Sie 8 verwenden Java sollten Sie verwenden Instant, DateTimeFormatund der andere modernen Thread - sicher Ersatz
Ich bin ein bisschen verwirrt darüber, was das Problem ist, dass SimpleDateFormat nicht threadsicher ist. Wenn zwei Threads den statischen Initialisierer gleichzeitig ausführen, kann ich nichts Schlimmeres sehen, als dass der SimpleDateFormat-Konstruktor zweimal aufgerufen wird, aber nur ein Moment davon (der letzte, der beendet wird) wird als "df" aufgezeichnet.
Gilbertpilz
2
private static String getCurrentDateIso()
{
    // Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    return dateFormat.format(new Date());
}
cprcrack
quelle
1

Trotzdem unterstützt joda-time nur das erweiterte Format: "2015-12-09T00: 22: 42.930Z", nicht das grundlegende: "20151209T002242.930Z" ... wir sollten eine Liste von Formaten besser mit Java SimpleDateFormat testen.

joão tiago viegas
quelle
1

Ich habe es in Android mit Calendar und SimpleDateFormat gemacht. Die folgende Methode gibt einen Kalender mit der Zeitzone "GMT" zurück (dies ist die universelle Zeitzone). Anschließend können Sie mit der Calendar-Klasse die Stunde zwischen verschiedenen Zeitzonen mithilfe der Methode setTimeZone () der Calendar-Klasse festlegen.

private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";

public static Calendar isoToCalendar(final String inputDate) {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
        Date date = dateFormat.parse(inputDate);
        calendar.setTime(date);
    } catch (ParseException e) {
        Log.e("TAG",e.getMessage());
    }
    return calendar;
}

ERINNERN SIE SICH: Die Date-Klasse kennt die TimeZone-Existenz nicht. Wenn Sie ein Datum debuggen, wird aus diesem Grund immer das Datum für Ihre aktuelle Zeitzone angezeigt.

Gerardo Suarez
quelle
1

Wenn Sie Wert auf Leistung legen , habe ich eine Bibliothek erstellt, die den Standard-Java-Parser und -Formatierer bei der Bearbeitung mit ISO8601-formatierten Daten übertrifft. DatetimeProcessor-Implementierungen sind threadsicher und können in einer gleichzeitigen Zuordnung oder in statischen Feldern zwischengespeichert werden.

<dependency>
  <groupId>com.axibase</groupId>
  <artifactId>date-processor</artifactId>
  <version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class DateFormatTest {
    private Clock clock;

    @Before
    public void prepare() {
        clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
    }

    @Test
    public void testIsoMillis(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
    }

    @Test
    public void testIsoMillisLocalZone(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
    }

    @Test
    public void testIsoMinutes(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
    }
}
Anton Rybochkin
quelle
0

Sie sollten eine einfache Möglichkeit hinzugefügt haben, von Datum zu Sofort zu wechseln, und auch eine Methode namens toISO8601, nach der viele Leute suchen. Als Ergänzung zu anderen Antworten von java.util.Date bis ISO 8601:

Instant.ofEpochMilli(date.getTime()).toString();

Es ist nicht wirklich sichtbar, wenn die automatische Vervollständigung verwendet wird, aber java.time.Instant.toString()::

Eine Zeichenfolgendarstellung dieses Augenblicks unter Verwendung von ISO-8601

Christophe Roussy
quelle
0
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())
ein Stift
quelle
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Vishal Chhodwani
-2

Versuche dies,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
        String date=sdf.format (new Date() );

Es ist für ISO 8601 Format

Surej
quelle
2
Dies würde Daten in der falschen Zeitzone verwenden, siehe Antwort von Carlos.
Stian Soiland-Reyes