2017-06-10 47 views
0

我在時區更改器上遇到了麻煩。我使用代碼時區更改器JAVA

for (int i = 0; i < data.size(); i++) { 
     try { 
      String time = (String) data.get(i).get("time_utc_8"); 
      time = time.replace('+', '-'); 

      String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX"; 
      SimpleDateFormat sdf = new SimpleDateFormat(pattern); 
      TimeZone tz = TimeZone.getTimeZone("UTC+8"); 
      sdf.setTimeZone(tz); 
      Date dateTime = sdf.parse(time); 

      String pattern_2 = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
      SimpleDateFormat sdf_2 = new SimpleDateFormat(pattern_2); 
      String d = sdf_2.format(dateTime); 

      data.get(i).put("time_utc_8", d); 

      // System.out.println(data.get(i).get("time")); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

解析和更改時區。

這是我的例子輸入:

2016-06-26T16:32:31.654120 + 00:00

而我得到的輸出:

2016-06 -27 00:43:25.000120

但是正確的輸出必須是:

2016年6月27日00:32:31.654120

我怎樣才能解決這個問題呢?

+1

我不能更強烈反對使用傳統的'java.util.Date'。您應該在'java.time'包中查找適合您需求的最合適的類。 –

+0

@JoeC因此,問題是'java.util.Date'? –

+1

@ Zi-yanTseng'java.util.Date'已經過時,並且有大量的錯誤:https://stackoverflow.com/questions/1969442/whats-wrong-with-java-date-time-api - 它被替換通過新的API,我展示瞭如何在我的回答中使用 –

回答

1

首先,來看看在javadoc for SimpleDateFormat:在S模式是毫秒字段,其最大值爲999 。要使用新的java.time類(如果您使用Java> = 8)或ThreeTen Backport(對於Java < = 7),則可以使用新的java.time類 - 這些新類支持多於3個分類數字在小數部分的字段中。

下面的代碼既適用於,唯一的區別是包名(java.timejava.time.format爲Java> = 8或org.threeten.bporg.threeten.bp.format爲Java < = 7)。但類和方法名是相同的:

// parser (format with 6 digits in fraction of second) 
DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX"); 
// parse input, use UTC+8 (ZoneOffset.ofHours(8)) 
ZonedDateTime dt = ZonedDateTime.parse("2016-06-26T16:32:31.654120+00:00", parser) 
    .withZoneSameInstant(ZoneOffset.ofHours(8)); 

// formatter for output, using your format 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); 
System.out.println(formatter.format(dt)); // 2016-06-27 00:32:31.654120 

輸出將是:

2016年6月27日00:32:31.654120

+1

謝謝,我會研究這兩個API,這對我來說真的很有幫助 –