java中的无法解析的日期异常

时间:2011-10-15 09:49:31

标签: java android datetime date

这些代码行

SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yy"); 

     ContentValues values = new ContentValues();
        values.put(COL_EVENT_ID, appointment.mEventId);
        try {
            values.put(COL_START_DATE, String.valueOf(formatter.parse(appointment.mStartDate.toString())));
            values.put(COL_END_DATE, String.valueOf(formatter.parse(appointment.mEndDate.toString())));

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

导致此异常

10-15 11:44:38.150: WARN/System.err(3861): java.text.ParseException: Unparseable date: "Mon Jan 10 00:10:00 GMT+02:00 2011"

可能的解决方案是什么?

2 个答案:

答案 0 :(得分:6)

您的格式完全错误。当你可能意味着mm时,你不仅使用MM(这意味着分钟),而且这个:

Mon Jan 10 00:10:00 GMT+02:00 2011

显然

格式

dd/MM/yy

你可能想要像

这样的东西
EEE MMM dd HH:mm:ss z yyyy

编辑:这适用于桌面Java:

import java.text.*;

public class Test {

    public static void main(String[] args) throws ParseException {
        String value = "Mon Jan 10 00:10:00 GMT+02:00 2011";
        String pattern = "EEE MMM dd HH:mm:ss z yyyy";
        DateFormat format = new SimpleDateFormat(pattern);
        System.out.println(format.parse(value));
    }
}

您当然可以设置SimpleDateFormat的文化。

答案 1 :(得分:0)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

使用 java.time(现代日期时间 API)的解决方案:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "Mon Jan 10 00:10:00 GMT+02:00 2011";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM d H:m:s OOOO uuuu", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

ONLINE DEMO

注意事项:

  1. m 指定 分时,而 M 指定 月份。您错误地使用了前者。
  2. 解析器使用的模式(DateTimeFormatterSimpleDateFormat)应与输入的日期时间字符串匹配。你的模式,dd/mm/yy 已经很远了。
  3. Never use SimpleDateFormat or DateTimeFormatter without a Locale

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project