我正在尝试解析日期,但我得到了时区例外

时间:2016-03-09 14:09:49

标签: android datetime calendar simpledateformat

这是我的日期String" Thu Feb 25 12:58:28 MST 2016"然后我使用这个合成器来解析" E MMM dd HH:mm:ss Z yyyy"。

但是我得到了日期解析错误。

我该怎么办?

我正在使用以下函数

解析日期字符串
public static String getDate(String targrtDate) {
    String dateStr = targrtDate;
    DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(date);

    if (date == null) {
        return "";
    }

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR);
    String formatedTime = cal.get(Calendar.HOUR) + "/" + cal.get(Calendar.MINUTE);

    Log.i("formatedDate", "" + formatedDate + " " + formatedTime);

    return formatedDate;
}

2 个答案:

答案 0 :(得分:0)

我已经解决了日期解析问题。

如果有人使用MST时区并且如果它给出了解析错误,那么请将SimpleDateFormat()的第二个参数添加为

new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy", Locale.US);

所以我的最终代码将是

public static String getDate(String targrtDate) {
    String dateStr = targrtDate;
    SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy", Locale.US);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(date);

    if (date == null) {
        return "";
    }

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR);
    String formatedTime = cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE);

    Log.i("formatedDate", "" + formatedDate + " " + formatedTime);

    return formatedDate;
}

特别感谢@MenoHochschild

答案 1 :(得分:0)

TL;博士

ZonedDateTime.parse( 
    "Thu Feb 25 12:58:28 MST 2016" , 
    DateTimeFormatter.ofPattern( "E MMM dd HH:mm:ss z uuuu" , Locale.US ) 
)
  

2016-02-25T12:58:28-07:00 [美国/丹佛]

java.time

现代方法使用java.time类。对于Android,请参阅下面的最后一个项目符号。

String input =  "Thu Feb 25 12:58:28 MST 2016" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM dd HH:mm:ss z uuuu" , Locale.US ) ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;

请参阅此代码在IdeOne.com上直播。 (但请注意,该站点上的JVM硬连接到Locale.US,其他任何内容都被忽略。)

  

zdt.toString():2016-02-25T12:58:28-07:00 [America / Denver]

您的输入字符串格式很糟糕。如果可能,请更改为使用标准ISO 8601格式。标准格式实用,易于通过机器解析,并且易于被不同文化的人阅读。方便的是,在解析/生成字符串时,默认情况下会在java.time类中使用这些格式。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如MSTESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

ZoneId zEdmonton = ZoneId.of( "America/Edmonton" ) ;
ZoneId zDenver = ZoneId.of( "America/Denver" ) ;
ZoneId zMazatlan = ZoneId.of( "America/Mazatlan" ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?