Java 不可剥夺的日期:“;2014年10月10日星期五23:11:07;(在偏移量20处)

Java 不可剥夺的日期:“;2014年10月10日星期五23:11:07;(在偏移量20处),java,android,date,unparseable,Java,Android,Date,Unparseable,我创建此函数是为了分析日期,但这给出了一个例外:不可解析的日期:“2014年10月10日星期五23:11:07”(偏移量20)。请帮助我,因为我无法找出此代码的错误 public Date parseDate() { String strDate ="Fri Oct 10 23:11:29 IST 2014"; String newPattern = "EEE MMM dd HH:mm:ss Z yyyy"; SimpleDateFormat formatter = ne

我创建此函数是为了分析日期,但这给出了一个例外:不可解析的日期:“2014年10月10日星期五23:11:07”(偏移量20)。请帮助我,因为我无法找出此代码的错误

public Date parseDate() {
    String strDate ="Fri Oct 10 23:11:29 IST 2014";
    String newPattern = "EEE MMM dd HH:mm:ss Z yyyy";
    SimpleDateFormat formatter = new SimpleDateFormat(newPattern);
    try {
        Date date = formatter.parse(strDate);
        return date;
    } catch (java.text.ParseException e) {
        e.printStackTrace();
    }
    return null;
}

为解析器使用区域设置:

    SimpleDateFormat formatter = new SimpleDateFormat(newPattern, Locale.US);
这会解决你的问题。至少你的例子对我有用

编辑:

看起来Android和IST时区确实存在问题。我可以使用上述模式解析Android上的任何时区,但不能解析IST

如果字符串中有IST区域,则快速修改时区部分。 这在Android上也适用于我:

    String strDate = "Fri Oct 10 23:11:29 IST 2014";
    strDate = strDate.replace(" IST ", " GMT+0530 ");
    String newPattern = "EEE MMM dd HH:mm:ss Z yyyy";

    SimpleDateFormat formatter = new SimpleDateFormat(newPattern, Locale.ENGLISH);

使用此代码它会工作。我认为IST存在问题,它无法识别它

public Date parseDate(String strDate) {
    strDate = "Fri Oct 10 23:11:29 2014";
    String newPattern = "EEE MMM dd HH:mm:ss yyyy";
    SimpleDateFormat formatter = new SimpleDateFormat(newPattern);
    formatter.setTimeZone(TimeZone.getTimeZone("IST"));
    Date date;
    try {
        date = formatter.parse(strDate.trim());
        Log.i("minal", "date:" + date);
        return date;
    } catch (java.text.ParseException e) {
        e.printStackTrace();
        Log.d("Populace", "ParseException: " + e.getLocalizedMessage());
    }
    return null;

}

根据文件,

一般时区应该使用小的
z
而不是大写的
z

但是,我尝试了它(JavaSE1.8.0),它既可以使用
z
,也可以使用
z


正如Android007在评论中写道的:“在Java应用程序中,它工作正常,但在Android上却有例外”——这可能是因为您的库比标准的Oracle J2SE更彻底地实现了契约:)

另见此处:

//将格式化程序设置为宽松解决了这个问题


感谢大家的帮助……

您的日期模式包含对区域设置敏感的模式。由于SimpleDataFormat支持在不同地区(英语、法语、美国、日语等)解析日期,因此您必须指定使用哪一种

从您的“IST”判断,您计算机上当前的默认区域设置可能不是英语或美国。由于字符串“Fri”和“Oct”是英文的,因此使用默认语言环境解析将失败

将格式化程序编辑为以下内容,它应该可以工作:

SimpleDateFormat formatter = new SimpleDateFormat(newPattern, Locale.ENGLISH);

这段代码毫无例外地为我工作。我看不到问题。找不到您代码的问题!它永远不会抛出异常。然而,对我来说,我需要使用
E
而不是
EEE
来正确解析日期。在Java应用程序中,它工作正常,但在Android上出现异常:(但我无法从日期删除IST,因为它将随位置的变化而变化,因此它将随地区而变化您已删除“IST”来自字符串strDateYes,也在我的Android上。查看我编辑的答案和可能的修复。这是一个糟糕的解决方案。如果日期位于不同的时区,例如2014年10月10日星期五23:11:29 PDT或其他时间,该日期会如何?他是否假设为所有可能的时区替换字符串?@portfoliobuilder只有在字符串。每隔一个时区工作。
2014年10月10日星期五23:11:29太平洋标准时间
将正确转换,所有其他时区也将正确转换。将可能的IST时区替换为等效的GMT+0530将是一种解决方法。您可以将“IST”替换为“GMT+5:30”我认为@alienchow是正确的!您应该设置本地,还应该设置formatter.Lenient(true)和formatter.setTimeZone(TimeZone.getDefault()),并使用模式“EEE MMM dd hh:mm:ss Z yyyy”,这样您就不会再有解析错误了。
 SimpleDateFormat formatter = new SimpleDateFormat(newPattern);
 formatter.setLenient(true);
SimpleDateFormat formatter = new SimpleDateFormat(newPattern, Locale.ENGLISH);