2014-11-06 120 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。