11

Ich habe diese folgenden Java.lang.String Werte, die String Wert von TIMESTAMPTZ darstellt. Ich muss diese Java.lang.String TO oracle.sql.TIMESTAMPTZ konvertieren.Convert `Java.lang.String` TO` oracle.sql.TIMESTAMPTZ`

"2016-04-19 17:34:43.781 Asia/Calcutta", 
"2016-04-30 20:05:02.002 8:00", 
"2003-11-11 00:22:15.0 -7:00", 
"2003-01-01 02:00:00.0 -7:00", 
"2007-06-08 15:01:12.288 Asia/Bahrain", 
"2016-03-08 17:17:35.301 Asia/Calcutta", 
"1994-11-24 11:57:17.303" 

Ich habe es auf viele Arten versucht.

Probe 1:

versucht durch SimpleDateFormat

String[] timeZoneValues = new String[]{"2016-04-19 17:34:43.781 Asia/Calcutta", "2016-04-30 20:05:02.002 8:00", "2003-11-11 00:22:15.0 -7:00", "2003-01-01 02:00:00.0 -7:00", "2007-06-08 15:01:12.288 Asia/Bahrain", "2016-03-08 17:17:35.301 Asia/Calcutta", "1994-11-24 11:57:17.303"}; 
     for(String timeZoneValue: timeZoneValues){ 
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS XXX"); 
      try { 
       simpleDateFormat.parse(timeZoneValue); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
     } 

verwenden, die eine Ausnahme ausgelöst:

java.text.ParseException: Unparseable date: "2016-04-19 17:34:43.781 Asia/Calcutta" 
    at java.text.DateFormat.parse(DateFormat.java:357) 

Probe 2:

es versucht, diese String Werte direkt durch Umwandeln in Timestamp oder oracle.sql.TIMESTAMPTZ

String parse = "2016-04-19 17:34:43.781 8:00"; 
     try { 
      Timestamp timestamp = Timestamp.valueOf("2016-04-19 17:34:43.781 8:00"); 
     }catch (Exception ex){ 
      ex.printStackTrace(); 
     } 

Ausnahme:

java.lang.NumberFormatException: For input string: "781 8:000" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:492) 
    at java.lang.Integer.parseInt(Integer.java:527) 
    at java.sql.Timestamp.valueOf(Timestamp.java:253) 

Probe 3:

String parse = "2016-04-19 17:34:43.781 Asia/Calcutta"; 
DateTimeFormatter dateTimeFormatter = ISODateTimeFormat.dateTimeNoMillis(); 
DateTime dateTime = dateTimeFormatter.parseDateTime(parse); 
Timestamp timeStamp = new Timestamp(dateTime.getMillis()); 

Ausnahme:

Invalid format: "2016-04-19 17:34:43.781 Asia/Calcutta" is malformed at " 17:34:43.781 Asia/Calcutta" 

Probe 4:

try { 
TIMESTAMPTZ timestamptz = new TIMESTAMPTZ(connection, (String) colValue); 
}catch (Exception ex){ 
ex.printStackTrace(); 
} 

Ausnahme:

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 
    at java.sql.Timestamp.valueOf(Timestamp.java:249) 
    at oracle.sql.TIMESTAMPTZ.toBytes(TIMESTAMPTZ.java:1919) 
    at oracle.sql.TIMESTAMPTZ.<init>(TIMESTAMPTZ.java:253) 

Ich versuche, den TIMESTAMPTZ Wert in Oracle Datenbank einzufügen Apache Metamodel mit und ich habe Java 1.7 auf meinem System installiert.

+1

Sie haben kein konsistentes Datumsformat in den Eingaben. Das wird ziemlich schwer zu handhaben sein. – Mubin

+0

@Mubin Können Sie bitte alle möglichen Lösungen vorschlagen, auch Strings sind nicht konsistent? –

+0

Ich fürchte, Sie müssen möglicherweise Ihre eigene Implementierung von 'DateFormat' erstellen – user902383

Antwort

2

Ihre Zeitstempel sind nicht in einem standardmäßigen Java-Format. Um sie analysieren zu können, müssen Sie also benutzerdefinierten Code für die Verarbeitung solcher Formate schreiben.

Paar von Beobachtungen:

Asien/Kalkutta ist keine gültige parseable Time-Zone, daher müssen Sie einige Mechanismus entsprechende Zeitzone zu erhalten.

8:00 ist auch keine gültige parseable Zeitzone in Java, daher müssen Sie ein Mechanismus in einem gültigen Wert zu forma +08: 00

Keeping oben Punkten beachten, Code folgenden tun das Nötige für dich.

SimpleDateFormat dateFormatTZGeneral = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z"); 
    SimpleDateFormat dateFormatTZISO = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS XXX"); 
    SimpleDateFormat dateFormatWithoutTZ = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 


    String[][] zoneStrings = DateFormatSymbols.getInstance().getZoneStrings(); 

    Date date = null; 

    String[] timeStampSplits = timestamp.split(" "); 
    if(timeStampSplits.length>2) { 

     String timezone = timeStampSplits[2]; 
     //First Case Asia/Calcutta 
     if(Character.isAlphabetic(timezone.charAt(timezone.length()-1))) { 

      for(String[] zoneString: zoneStrings) { 
       if(zoneString[0].equalsIgnoreCase(timezone)) { 
        timeStampSplits[2] = zoneString[2]; 
        break; 
       } 
      } 

      timestamp = createString(timeStampSplits," "); 
      date = getDate(timestamp, dateFormatTZGeneral); 
     } else { 
      //Second Case 8:00 
      timeStampSplits[2] = formatTimeZone(timeStampSplits[2]); 

      timestamp = createString(timeStampSplits," "); 
      date = getDate(timestamp, dateFormatTZISO); 
     } 

    } else { 
     // Third Case without timezone 
     date = getDate(timestamp, dateFormatWithoutTZ); 
    } 

    System.out.println(date); 

    TIMESTAMPTZ oraTimeStamp = new TIMESTAMPTZ(<connection object>,new java.sql.Timestamp(date.getTime()); 

Above-Code verwendet folgende Utility-Methoden

private static Date getDate(String timestamp, SimpleDateFormat dateFormat) { 
    Date date = null; 
    try { 
     date = dateFormat.parse(timestamp); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return date; 
} 

private static String createString(String[] contents, String separator) { 
    StringBuilder builder = new StringBuilder(); 
    for (String content : contents) { 
     builder.append(content).append(separator); 
    } 
    builder.deleteCharAt(builder.length()-separator.length()); 

    return builder.toString(); 
} 

private static String formatTimeZone(String timeZone) { 
    String[] timeZoneSplits = timeZone.split(":"); 
    DecimalFormat formatter = new DecimalFormat("+##;-#"); 
    formatter.setMinimumIntegerDigits(2); 

    timeZoneSplits[0] = formatter.format(Integer.parseInt(timeZoneSplits[0])); 
    return createString(timeZoneSplits, ":"); 
} 

Dieser Code speziell geschrieben wird Ihre Zeitstempel Beispiele gerecht zu werden, kann jede Abweichung hiervon nicht behandelt werden, und es wird mehr Anpassung benötigen.

Hoffe das hilft dir.

+0

Es hilft wirklich beim Parsen aber immer noch bekomme ich Probleme beim Einfügen des Wertes von 'TIMESTAMPTZ'. Diese unterschiedlichen Zeitzonenwerte werden automatisch in die Zeitzone der Standarddatenbank konvertiert. Der in die Datenbank eingefügte Wert hätte beispielsweise 2003-01-01 02: 59: 04.123 -08: 00' sein, wurde aber als '2003-01-01 16: 29: 04.123 Asia/Calcutta' eingefügt.Es konvertiert den Wert nach 'Asien/Kalkutta' Zeitzone –

+0

Ich habe TIMESTAMPTZ ab sofort nicht benutzt. wo auch immer in meiner Arbeit, wann immer wir Daten in einer bestimmten Zeitzone speichern mussten, haben wir Strings verwendet, um sie zu speichern. – Sanjeev

0

Die Timestamp-Strings sind in verschiedenen Formaten,

Ex-Here SimpleDateFormat uses pattern : 
'yyyy-MM-dd HH:mm:ss.SSS XXX' 

where X is to represent timezone in [ISO 8601 time zone][1] format.For this  
timezone valid Timestamp Strings are (-08; -0800; -08:00).So,'Asia/Kolkata' 
will not be parsed for Sample 1. 

There are three type of Timezone pattern to be assigned to SimpleDateFormat. 
**'Z'** - RFC 822 time zone. 
**'z'** - General time zone. 
**'X'** - ISO 8601 time zone. 

entweder So unterschiedliche Simple der Nutzung oder Zeitzone aller Zeitstempel in dasselbe Muster von Zeitzone konvertieren und einen einzigen Simple verwenden.

+0

In SimpleDateFormat gibt es verschiedene Tags, einige von ihnen sind in Groß- und Kleinbuchstaben. Seien Sie vorsichtig, sie zu verwenden – Hailey

1

Sie müssen das Datum entsprechend den Daten analysieren, die dynamisch kommen.Weitere Informationen über das, was von Android verwendet Konstante müssen Sie die link und im Falle von Java Sie Hier folgen link haben folgen, ist der Code-Schnipsel von einigen anderen Format Beispiel 1

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzzz"); 
    Date date = null; 
    try { 
     date = sdf.parse("2016-04-19 17:34:43.781 Pacific Standard Time"); 
     Log.e("date",""+date); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    sdf.setTimeZone(TimeZone.getTimeZone("IST")); 
    System.out.println(sdf.format(date)); 

Probe 2

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z"); 
    Date date = null; 
    try { 
     date = sdf.parse("2016-04-19 17:34:43.781 -08:00"); 
     Log.e("date",""+date); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    sdf.setTimeZone(TimeZone.getTimeZone("IST")); 
    System.out.println(sdf.format(date)); 

Beispiel 3

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    Date date = null; 
    try { 
     date = sdf.parse("2016-04-19 17:34:43.781"); 
     Log.e("date",""+date); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    sdf.setTimeZone(TimeZone.getTimeZone("IST")); 
    System.out.println(sdf.format(date)); 

so wie pro t hese drei Satz von Probe können Sie jede Art von Datum Zeit mit Ausnahme der ein Format parsen dh "2016-04-19 17: 34: 43.781 Asien/Kalkutta" als die Zeitzone Asien/Kalkutta oder Asien/Bahrain kann nicht von Android gelesen werden oder Java. Dies ist das Format, das von PHP nach meinem Verständnis unterstützt wird. SO Wenn Sie diese Art von Format analysieren möchten, müssen Sie Ihr benutzerdefiniertes SimpleDateFormat schreiben und diese Inhalte identifizieren und die Berechnung nach Ihren Bedürfnissen durchführen.