2016-07-08 13 views
4

Ich versuche mein Format 2016-07-08T00: 00: 00.000Z zu bekommen.Wie bekomme ich meine Stunden, Minuten, Sekunden und Millisekunden als Nullen?

String myDate = "20160708"; 
LocalDate myLocalDate = LocalDate.parse(myDate, DateTimeFormatter.BASIC_ISO_DATE); 
OffsetDateTime myOffsetDate = myLocalDate.atTime(OffsetTime.now(ZoneOffset.UTC)); 

System.out.println(myOffsetDate); //2016-07-08T14:58:23.170Z 
+0

Sie meinen, Sie haben keine Zeit benötigen, müssen Sie nur Ausgang 'T00: 00: 00.000Z'? – Alexey

+0

Ich versuche auch das Datum auszugeben. – Jon

+0

Ich habe das schon herausgefunden) – Alexey

Antwort

6

Nun sagen Sie nicht "Ich möchte, dass es die aktuelle Zeit verwendet"! Das ist, was dies tut:

OffsetTime.now(ZoneOffset.UTC) 

Wenn Sie gerade ein OffsetDateTime von einem LocalDate wollen durch eine Nullpunktverschiebung und Mitternacht bereitstellen, können Sie verwenden:

OffsetDateTime myOffsetDate = myLocalDate 
    .atTime(LocalTime.MIDNIGHT) 
    .atOffset(ZoneOffset.UTC); 

Oder wenn Sie bevorzugen:

OffsetDateTime myOffsetDate = myLocalDate 
    .atTime(OffsetTime.of(LocalTime.MIDNIGHT, ZoneOffset.UTC)); 

(Persönlich bevorzuge ich die erste Version, mich ...)

Beachten Sie, dass das bringt dich einfach zum richtigen OffsetDateTime. Wenn Sie, dass mit Millisekunden und Sekunden formatieren möchten, müssen Sie das explizit tun:

DateTimeFormatter formatter = DateTimeFormatter 
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"); 
System.out.println(myOffsetDate.format(formatter)); 

Wie in den Kommentaren erwähnt, wenn Sie mit einem ZonedDateTime anstelle eines OffsetDateTime zu finden sind, können Sie

verwenden
ZonedDateTime myOffsetDate = myLocalDate.atStartOfDay(ZoneOffset.UTC); 
+1

@assylias: True - wird das hinzufügen. –

+0

Vielen Dank für die Hilfe! – Jon

+0

Gibt es eine Möglichkeit, die Sekunden und Millisekunden beizubehalten, wenn ich versuche, die formatierte Zeichenfolge zurück in eine OffsetDateTime zu konvertieren? Es scheint die Sekunden und Millisekunden zu entfernen, die es schreiben, wie OffsetDateTime.parse (formatierterString). – Jon

0

Ich bin nicht ganz sicher, ob Sie das Datumsformat ISO_INSTANCE mit der angegebenen Zeichenfolge LocalDate abrufen können. aber Sie können unten 8 Code-Code verwenden, um das erforderliche Format zu erhalten. Genießen Sie

public String getISO_8601DateFormat(String yyyyMMdd){ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 
    String requiredFormat = null; 
    try { 
     Date inputDate = sdf.parse(yyyyMMdd); 
     long dateLongRepresentation = inputDate.getTime(); 
     long myTimeZoneOffset = TimeZone.getTimeZone(ZoneId.systemDefault()).getOffset(inputDate.getTime()); 
     Instant instance = Instant.ofEpochMilli(dateLongRepresentation + myTimeZoneOffset); 
     requiredFormat = instance.toString(); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return requiredFormat; 
} 

Codierung mit Java :)

+2

Keine gute Lösung. Sie mischen die alten Datum-Uhrzeit-Klassen ('Date',' SimpleDateFormat') mit ihren Ersetzungen, den java.time-Klassen. Die alten Klassen sind schlecht entworfen, verwirrend, mühsam und haben eine geringere Auflösung (Millisekunden oder Nanosekunden). Vermeide die alten Klassen. Siehe die [richtige Antwort] (http://stackoverflow.com/a/38270241/642706) von Jon Skeet. Beachten Sie auch das Tag in der Frage nach einer java.time-Lösung. –

+0

Ja, ich stimme zu, die Lösung von Jon Skeet ist viel sauberer (ich bin ein sehr schlechter Coder :() –

+1

Nein, kein schlechter Programmierer.Java hat eine so große Bibliothek von Klassen, einige von ihnen jetzt veraltet, dass es kann Wenn Sie das JavaDoc für die alten Datums-/Uhrzeitklassen gründlich lesen, versuchen Sie "java.time stattdessen zu verwenden". –