【问题标题】:Formatting date with time zone. Wrong format使用时区格式化日期。格式错误
【发布时间】:2014-11-06 13:45:51
【问题描述】:

我使用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);

我尝试了很多格式更改,但仍然收到此错误。谁能告诉我我传递的字符串的确切格式?

【问题讨论】:

  • 您遇到了 compile-time 错误。这不取决于您使用的格式。这只是意味着您的源代码无效 - SimpleDateFormat.parse 可以抛出 ParseException,而您既没有捕捉到它,也没有声明它可以抛出。
  • 请注意,打印出 Date 并没有多大帮助 - 您需要使用单独的 SimpleDateFormat 与您的“目标”格式。
  • 我的错!我忘了添加`try catch`块。感谢您的发现。
  • @Freakyuser 请在发帖前搜索 StackOverflow。数百个问题和答案中的任何一个都有示例代码,您可以研究这些代码以查看日期时间字符串解析期间的异常处理。
  • @Freakyuser 该格式问题也已在数百个问答中得到处理,例如this one。再次,请在发布前搜索。 StackOverflow 被不必要的重复问题污染了。

标签: java


【解决方案1】:

处理异常

您尚未在代码中处理异常。这就是编译器给出错误的原因。你需要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] 转换为另一种格式。如果我是正确的,那么以下示例可能会对您有所帮助。

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

【讨论】:

  • 最好不要鼓励 OP 有一个空的 catch 块。
  • @khelwood 是的!现在我添加了它
  • +1 谢谢。我得到Mon Nov 24 18:30:00 GMT 2014 的输出。日期减一。我应该更改语言环境吗?
  • @Freakyuser 你能澄清一下吗?
【解决方案2】:

没问题

如果您按照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.time 包(受 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 Update 25。早期版本的 java.text.SimpleDateFormat 在 Z 字母和偏移方面具有不同的行为。但是,同样,您甚至不应该使用 SimpleDateFormat。

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多