2014-11-06 39 views
1

我已經嘗試了許多不同類型的解決方案,使用java.text.SimpleDateFormat,但不能完全正確。格式化日期和時區。錯誤的格式

我收到的輸入字符串是Tue Nov 5 00:00:00 UTC+0530 2013
我想要的格式是dd-MMM-yy
下面是我使用的代碼:

SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM d HH:mm:ss zZ yyyy", Locale.ENGLISH); 
date = formatter.parse(s); 
System.out.println(date); 

我收到error: unreported exception ParseException; must be caught or declared to be thrown date = formatter.parse(s);

我嘗試了很多的變化在我的格式,但我仍然收到此錯誤。任何人都可以讓我知道我傳遞的字符串的確切格式嗎?

+1

您正在收到*編譯時*錯誤。這不取決於你使用的格式。這只是說你的源代碼無效 - 'SimpleDateFormat.parse'可以拋出'ParseException',你既沒有捕獲它,也沒有聲明它可以被拋出。 – 2014-11-06 13:49:03

+1

請注意,打印出'Date'並不會有太大的幫助 - 您需要將「SimpleDateFormat」與您的「目標」格式一起使用。 – 2014-11-06 13:49:40

+0

我的壞!我忘了添加try catch塊。感謝您的發現。 – Freakyuser 2014-11-06 14:02:47

回答

4

手柄異常

您尚未處理代碼中的異常。這就是編譯器給出錯誤的原因。您需要handleParseException可能在解析過程中被拋出。

SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM d HH:mm:ss zZ yyyy", Locale.ENGLISH); 
try{ 
    date = formatter.parse(s); 
    System.out.println(date); 
}catch(ParseException ex){ 
    //exception 
    ex.printStackTrace(); 
} 

或者您可以將throws ParseException添加到您的方法中。

根據你的評論,它似乎是你試圖將日期[字符串]轉換爲另一種格式。如果我是正確的,那麼下面的例子可以幫助你。

String inputstring="Tue Nov 5 00:00:00 UTC+0530 2013"; 
SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM d HH:mm:ss zZ yyyy", Locale.ENGLISH); 
DateFormat outformat = new SimpleDateFormat("dd-MMM-yy"); 
try { 
    String result = outformat.format(formatter.parse(inputstring)); 
    System.out.println(result); 
} catch (ParseException ex) { 
    ex.printStackTrace(); 
} 

輸出:

04-Nov-13 
+3

可能最好不要鼓勵OP有一個空的catch塊。 – khelwood 2014-11-06 13:51:18

+0

@khelwood是啊!現在我添加了它 – 2014-11-06 14:01:46

+0

+1謝謝。我得到了'Mon Nov 24 18:30:00 GMT 2014'的輸出。日期減1。我應該改變語言環境嗎? – Freakyuser 2014-11-06 14:16:34

0

沒有問題

你的代碼工作*如果趕上例外,因爲定向在correct answer

String input = "Tue Nov 5 00:00:00 UTC+0530 2013"; 
java.text.SimpleDateFormat sdformatter = new java.text.SimpleDateFormat("EEE MMM d HH:mm:ss zZ yyyy" , Locale.ENGLISH); 
java.util.Date date = null; 
try { 
    date = sdformatter.parse(input); 
} catch (ParseException ex) { 
    System.out.println("ERROR: " + ex); // … handle exception 
} 
System.out.println("date: " + date + " (adjusted to Kolkata time via Joda-Time: " + new DateTime(date , DateTimeZone.forID("Asia/Kolkata"))); 

運行時。

date: Mon Nov 04 10:30:00 PST 2013 (adjusted to Kolkata time via Joda-Time: 2013-11-05T00:00:00.000+05:30 

喬達時間

這同一格式Joda-Time 2.5工作。

與Java捆綁在一起的java.util.Date/.Calendar/java.text.SimpleDateFormat類是衆所周知的麻煩,混亂和缺陷。避免它們。使用Joda-Time或Java 8中內置的新Java時間包(受Joda-Time啓發)。

String input = "Tue Nov 5 00:00:00 UTC+0530 2013"; 
DateTimeFormatter formatter = DateTimeFormat.forPattern("EEE MMM d HH:mm:ss zZ yyyy"); 
DateTime dateTime = formatter.parseDateTime(input).withZone(DateTimeZone.forID("Asia/Kolkata")); 
System.out.println("dateTime: " + dateTime); 

運行時。

dateTime: 2013-11-05T00:00:00.000+05:30 

備用格式

在你的情況,你可以不理會UTC,因爲它是多餘的偏移量(+0530)。偏移量假定爲UTC。您可以使用引號來忽略字符。

DateTimeFormatter formatter = DateTimeFormat.forPattern("EEE MMM d HH:mm:ss 'UTC'Z yyyy"); 

*您的代碼工作我使用Java 8更新25。早期版本的java.text.SimpleDateFormat具有Z字母和偏移量的不同行爲。但是,再次,你甚至不應該使用SimpleDateFormat。