11

में कनवर्ट करें मेरे पास निम्नलिखित Java.lang.String मान हैं जो TIMESTAMPTZ का मान दर्शाते हैं। मुझे इन Java.lang.String से oracle.sql.TIMESTAMPTZ को परिवर्तित करने की आवश्यकता है।'Java.lang.String` को' 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" 

मैंने इसे कई तरीकों से आजमाया।

नमूना 1:

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

नमूना 2:

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(); 
      } 
     } 

का उपयोग कर वह एक अपवाद फेंका द्वारा यह कोशिश की

इन String मूल्यों सीधे परिवर्तित करके यह कोशिश कीमेंया 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(); 
     } 

अपवाद:

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) 

नमूना 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()); 

अपवाद:

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

नमूना 4:

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

अपवाद:

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) 

मैं Apache Metamodel का उपयोग कर Oracle डेटाबेस में TIMESTAMPTZ मान सम्मिलित करने की कोशिश कर रहा हूँ और मैं Java 1.7 अपने सिस्टम पर स्थापित किया है।

+1

आपके पास इनपुट में तिथियों का एक सतत प्रारूप नहीं है। रूपांतरण को संभालना बहुत कठिन होगा। – Mubin

+0

@Mubin क्या आप कृपया सभी संभावित समाधान सुझा सकते हैं यहां तक ​​कि स्ट्रिंग्स लगातार नहीं हैं? –

+0

मुझे डर है कि आपको 'डेटफॉर्मैट' – user902383

उत्तर

2

आपकी टाइमस्टैम्प मानक जावा पारदर्शी प्रारूपों में नहीं हैं। इसलिए उन्हें पार्स करने के लिए आपको ऐसे प्रारूपों को संभालने के लिए कस्टम कोड लिखना होगा।

टिप्पणियों के युगल:

एशिया/कोलकाता एक वैध Parseable समयक्षेत्र इसलिए आप कुछ व्यवस्था की जरूरत इसी समय क्षेत्र प्राप्त करने के लिए नहीं है,।

8:00 भी जावा में एक वैध Parseable समय-क्षेत्र इसलिए आप कुछ व्यवस्था की जरूरत कोई मान्य मान 08 में यह फ़ॉर्मेट करने के लिए नहीं है,: 00

, मन में ऊपर अंक रखते हुए निम्नलिखित कोड क्या करेंगे आपके लिए जरूरी

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()); 

कोड से ऊपर उपयोगिता तरीकों

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, ":"); 
} 

इस कोड को विशेष रूप से अपने टाइमस्टैम्प उदाहरण पूरा करने के लिए लिखा है, किसी भी विचलन इस द्वारा नियंत्रित नहीं किया जा सकता है और इसे और अधिक अनुकूलन की आवश्यकता होगी निम्नलिखित का उपयोग करता है।

उम्मीद है कि यह आपकी मदद करता है।

+0

यह वास्तव में पार्सिंग में मदद करता है लेकिन फिर भी मुझे 'TIMESTAMPTZ' के मान को सम्मिलित करने में समस्या हो रही है। यह स्वचालित रूप से इन अलग-अलग अलग-अलग समय क्षेत्र मानों को डिफ़ॉल्ट डेटाबेस के समय क्षेत्र में परिवर्तित करता है। उदाहरण के लिए डेटाबेस में डाला गया मान '2003-01-01 02: 59: 04.123 -08: 00' होना चाहिए, लेकिन इसे' 2003-01-01 16: 2 9: 04.123 एशिया/कलकत्ता 'के रूप में डाला गया था।यह 'एशिया/कलकत्ता' समय क्षेत्र –

+0

के अनुसार मान को परिवर्तित करता है मैंने अब तक TIMESTAMPTZ का उपयोग नहीं किया है। जब भी हमें किसी विशेष टाइमज़ोन में तिथियां सहेजनी पड़ती थी तब भी मेरे काम में जहां हमने उन्हें बचाने के लिए स्ट्रिंग्स का इस्तेमाल किया। – Sanjeev

0

टाइमस्टैम्प तार अलग प्रारूप में हैं,

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. 

तो, या तो अलग SimpleDateFormat के उपयोग करते हैं, या समय क्षेत्र का एक ही पैटर्न में सभी टाइमस्टैम्प की समय-क्षेत्र बदलने और एक भी SimpleDateFormat का उपयोग करें।

+0

SimpleDateFormat में अलग-अलग टैग हैं, उनमें से कुछ पूंजी और छोटे अक्षरों दोनों में हैं। इसलिए उन्हें उपयोग करने के लिए सावधान रहें – Hailey

1

आपको गतिशील डेटा आने वाले डेटा के अनुसार तारीख को पार्स करना होगा।क्या एंड्रॉयड द्वारा प्रयोग किया जाता निरंतर के बारे में जानकारी के लिए आप link और जावा के मामले में आप यहाँ link पालन करने के लिए पालन करने के लिए कुछ अलग स्वरूप का कोड स्निपेट नमूना है 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)); 

नमूना 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)); 
प्रति टी के रूप में

नमूना 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)); 

तो हेस नमूना के तीन सेट आप एक प्रारूप को छोड़कर किसी भी प्रकार के दिनांक समय को पार्स कर सकते हैं यानी "2016-04-19 17: 34: 43.781 एशिया/कलकत्ता" समय क्षेत्र के रूप में एशिया/कलकत्ता या एशिया/बहरीन एंड्रॉइड द्वारा पढ़ा नहीं जा सकता या जावा। यह प्रारूप है जो मेरी समझ के अनुसार PHP द्वारा समर्थित हो जाता है। इसलिए यदि आप इस प्रकार के प्रारूप को पार्स करना चाहते हैं तो मुझे लगता है कि आपको अपना कस्टम SimpleDateFormat लिखना होगा और इन सामग्री की पहचान करना होगा और अपनी आवश्यकता के हिसाब से गणना करना होगा।

संबंधित मुद्दे