11

Tôi có các giá trị sau đây Java.lang.String đại diện cho String giá trị của TIMESTAMPTZ. Tôi cần chuyển đổi các số này Java.lang.String TO oracle.sql.TIMESTAMPTZ.Chuyển đổi `Java.lang.String` thành` 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" 

Tôi đã thử bằng nhiều cách.

Mẫu 1:

Thử nó bằng cách sử dụng 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(); 
      } 
     } 

Đó ném một ngoại lệ:

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

Mẫu 2:

Thử nó bằng cách chuyển đổi các String giá trị trực tiếp vào.210 hoặc 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(); 
     } 

Ngoại lệ:

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) 

Mẫu 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()); 

Ngoại lệ:

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

Mẫu 4:

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

Ngoại lệ:

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) 

Tôi cố gắng để chèn giá trị TIMESTAMPTZ vào Oracle cơ sở dữ liệu sử dụng Apache Metamodel và tôi đã Java 1.7 được cài đặt trên hệ thống của tôi.

+1

Bạn không có định dạng ngày tháng nhất quán trong các yếu tố đầu vào. Điều đó sẽ khá khó khăn để xử lý chuyển đổi. – Mubin

+0

@Mubin Bạn có thể đề xuất tất cả các giải pháp có thể ngay cả các chuỗi không nhất quán không? –

+0

Tôi e rằng bạn có thể cần phải tạo việc triển khai của riêng bạn 'DateFormat' – user902383

Trả lời

2

Dấu thời gian của bạn không có định dạng phân tích cú pháp java chuẩn. Vì vậy, để phân tích chúng, bạn cần phải viết mã tùy chỉnh để xử lý các định dạng như vậy.

Couple quan sát:

Á/Calcutta không phải là một parseable TimeZone hợp lệ, do đó bạn cần một số cơ chế để có được múi giờ tương ứng.

8:00 cũng không phải là một parseable múi giờ hợp lệ trong java, do đó bạn cần một số cơ chế để định dạng nó trong một giá trị hợp lệ 08: 00

Giữ điểm nêu trên trong tâm trí, sau mã sẽ làm cần thiết cho bạn.

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

Trên mã sử dụng sau đây phương pháp hữu ích

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

Mã này được đặc biệt bằng văn bản để phục vụ cho ví dụ dấu thời gian của bạn, bất kỳ độ lệch có thể không được xử lý bằng cách này và nó sẽ cần phải tùy biến hơn.

Hy vọng điều này sẽ giúp bạn.

+0

Nó thực sự giúp phân tích cú pháp nhưng tôi vẫn gặp vấn đề khi chèn giá trị 'TIMESTAMPTZ'. Nó tự động chuyển đổi các giá trị múi giờ khác nhau khác nhau này thành múi giờ của cơ sở dữ liệu mặc định. Ví dụ: Giá trị được chèn vào cơ sở dữ liệu phải là '2003-01-01 02: 59: 04.123 -08: 00' nhưng giá trị được chèn vào như '2003-01-01 16: 29: 04.123 Asia/Calcutta'.Nó chuyển đổi giá trị theo múi giờ 'Châu Á/Calcutta' –

+0

Tôi chưa bao giờ sử dụng TIMESTAMPTZ kể từ bây giờ. bất cứ nơi nào trong công việc của tôi bất cứ khi nào chúng tôi phải lưu ngày trong một múi giờ cụ thể thì chúng tôi sử dụng Strings để lưu chúng. – Sanjeev

0

Các chuỗi Timestamp là ở định dạng khác nhau,

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. 

Vì vậy, hoặc là sử dụng khác nhau SimpleDateFormat, hoặc chuyển đổi múi giờ của tất cả các dấu thời gian vào cùng một mô hình của múi giờ và sử dụng một cá thể SimpleDateFormat duy nhất.

+0

Trong SimpleDateFormat có các thẻ khác nhau, một số trong số đó là cả chữ viết hoa và chữ nhỏ. Nên cẩn thận khi sử dụng chúng – Hailey

1

Bạn phải phân tích ngày theo dữ liệu sắp tới tức là động.Để biết thông tin về những gì thường xuyên được sử dụng bởi android bạn phải tuân theo các link và trong trường hợp của Java bạn phải tuân theo link Dưới đây là đoạn mã của một số định dạng khác nhau Sample 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)); 

Mẫu 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)); 

mẫu 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)); 

vì vậy, theo t hese ba bộ mẫu bạn có thể phân tích bất kỳ loại ngày nào ngoại trừ một định dạng tức là "2016-04-19 17: 34: 43.781 Asia/Calcutta" là múi giờ Châu Á/Calcutta hoặc Châu Á/Bahrain không thể đọc được bởi android hoặc java. Đây là định dạng được PHP hỗ trợ theo sự hiểu biết của tôi. SO Nếu bạn muốn phân tích các loại định dạng này thì tôi đoán bạn phải viết SimpleDateFormat tùy chỉnh của mình và phải xác định những nội dung này và thực hiện phép tính theo nhu cầu của bạn.

Các vấn đề liên quan