2016-05-25 7 views
0

Ich habe einen Workflow, wo ich einen Datumswert als Eingabe nehmen, bearbeiten und zur Ausgabe im exakten Format übergeben muss. Um diese Aufgabe zu bewältigen, ich benutze diese:Java Nicht übertragbares Datum: unterschiedliche Anzahl von Zeichen in ms Wert

TimeZone tz = TimeZone.getTimeZone("UTC"); 
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
df.setTimeZone(tz); 
long date = df.parse(inputDate).getTime() + 1; 
outputDate = df.format(date).toString(); 

Die meisten der Zeit, dieses Stück Code funktioniert gut. Aber manchmal bekomme ich Eingabedatum wie folgt aus:

2016-05-25T22:00:10.6Z 

Bitte geben Sie die Anzahl der Zeichen für ms bemerken, es 1 ist statt 3.

In Fällen wie oben, erhalte ich die Ausnahme:

java.text.ParseException: Unparseable date: "2016-05-25T22:00:10.6Z" 
      at java.text.DateFormat.parse(DateFormat.java:366) 

Es gibt keine Möglichkeit für mich, das Eingabedatum zu beeinflussen, aber ich brauche genau drei Zahlen in ms Teil. Wie bekomme ich es?

Antwort

1

können Sie die ParseException fangen und das Datum analysieren mit:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX"); 

Beispiel:

public static void main(String[] args) throws ParseException { 
    TimeZone tz = TimeZone.getTimeZone("UTC"); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX"); 

    df.setTimeZone(tz); 
    df2.setTimeZone(tz); 

    long date; 
    String dateToParse = "2016-05-25T22:00:10.6Z"; 
    try { 
     date = df.parse(dateToParse).getTime() + 1; 
    }catch (ParseException e){ 
     System.out.println("exception"); 
     date = df2.parse(dateToParse).getTime() + 1; 

    } 
    System.out.println(df.format(date)); 
} 
2

Beim Parsing man eigentlich nur einen Buchstaben angeben können (für jedes Feld) wie folgt aus:

DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.SX"); 
// "2016-5-25T22:0:10.6Z" input is acceptable 
// "2016-05-25T22:00:10.6Z" input is acceptable 
// "2016-05-25T22:00:10.678Z" input is NOT acceptable 

Es akzeptiert mehr als eine Ziffer (für jedes Feld) beim Parsen; was bedeutet, dass die Anzahl der Musterbuchstaben nicht signifikant ist für das Parsen (aber es ist signifikant für die Formatierung). Daher ist eine Eingabe wie "2016-05-25T22:00:10.6Z" für das obige Muster akzeptabel.

Es scheint jedoch gibt es ein Implementierungsproblem in Java 8 (was ich nicht genau weiß) oder vielleicht ist etwas nicht dokumentiert, so dass konsekutive Millisekunde und Zeitzone in Muster (zB SX oder SSSX) nicht ist so einfach. I bedeuten "2016-05-25T22:00:10.678Z" durch das Muster über nicht akzeptabel ist, während nonconsecutive eine akzeptabel ist, wie folgt aus:

DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.S X"); // notice the space 
// "2016-5-25T22:0:10.6 Z" input is acceptable 
// "2016-05-25T22:00:10.6 Z" input is acceptable 
// "2016-05-25T22:00:10.678 Z" input is acceptable 

Problem umgehen, wenn die Eingabe in Folge Millisekunden und der Zeitzone (kein Raum zwischen) hat, erzeugen mehrere DateFormat und fangen die Ausnahme.

DateFormat df1 = new SimpleDateFormat("y-M-d'T'H:m:s.SX"); 
DateFormat df2 = new SimpleDateFormat("y-M-d'T'H:m:s.SSX"); 
DateFormat df3 = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX"); 
try { 
    result = df1.parse(inputDate); // first attempt 
} catch (ParseException e1) { 
    try { 
     result = df2.parse(inputDate); // second attempt 
    } catch (ParseException e2) { 
     result = df3.parse(inputDate); // last attempt, dead if fails 
    } 
} 

Ja, dieses Problem zu umgehen ist eine Art von Schmutz: D.

Verwandte Themen