Java:无法解析的日期异常

时间:2010-01-05 21:27:04

标签: java date format

在尝试转换日期格式时,我得到一个例外:不可解析的日期,不知道如何解决这个问题。

我收到一个代表事件日期的字符串,并希望在GUI中以不同的格式显示此日期。

我想做的是以下内容:

private String modifyDateLayout(String inputDate){
        try {
            //inputDate = "2010-01-04 01:32:27 UTC";
            Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(inputDate);
            return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
        } catch (ParseException e) {
            e.printStackTrace();
            return "15.01.2010";
        }
    }

无论如何这条线

String modifiedDateString = originalDate.toString();

是假的。我想以下列格式获取日期字符串:

  

dd.MM.yyyy HH:mm:ss

并且输入String示例如下:

  

2010-01-04 01:32:27 UTC

有谁知道如何将上面的示例日期(字符串)转换为字符串格式dd.MM.yyyy HH:mm:ss?

谢谢!

编辑:我修复了错误的输入日期格式,但仍然无效。上面是粘贴的方法,下面是调试会话的屏幕图像。

alt text http://img683.imageshack.us/img683/193/dateproblem.png

#UPDATE 我跑了

String[] timezones = TimeZone.getAvailableIDs();

并且数组中有UTC字符串。这是一个奇怪的问题。

我做了一个有效的肮脏黑客:

private String modifyDateLayout(String inputDate){
    try {
        inputDate = inputDate.replace(" UTC", "");
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);
        return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
    } catch (ParseException e) {
        e.printStackTrace();
        return "15.01.2010";
    }
}

但我仍然希望在不缩短时区的情况下转换原始输入。

此代码是使用JDK 1.6为Android手机编写的。

2 个答案:

答案 0 :(得分:48)

你在这里基本上做的是依靠已经有固定模式的Date#toString()。要将Java Date对象转换为另一个人类可读的String模式,您需要SimpleDateFormat#format()

private String modifyDateLayout(String inputDate) throws ParseException{
    Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(inputDate);
    return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
}

顺便说一句,“{notnsable date”异常可以在SimpleDateFormat#parse()抛出 。这意味着inputDate不符合预期格式"yyyy-MM-dd HH:mm:ss z"。您可能需要修改模式以匹配inputDate的实际模式。

更新:好的,我做了一个测试:

public static void main(String[] args) throws Exception {
    String inputDate = "2010-01-04 01:32:27 UTC";
    String newDate = new Test().modifyDateLayout(inputDate);
    System.out.println(newDate);
}

这正确打印:

03.01.2010 21:32:27

(我在GMT-4上)

更新2:根据您的修改,您确实得到了ParseException。最可疑的部分将是UTC的时区。这在Java环境中实际上是已知的吗?您使用的Java版本和操作系统版本是什么?检查TimeZone.getAvailableIDs()。中间必须有UTC

答案 1 :(得分:0)

从Oracle文档中,Date.toString()方法将Date object转换为特定形式的字符串-请勿在Date对象上使用toString方法。尝试使用:

String stringDate = new SimpleDateFormat(YOUR_STRING_PATTERN).format(yourDateObject);

下一步是将stringDate解析为Date:

Date date = new SimpleDateFormat(OUTPUT_PATTERN).parse(stringDate);

请注意,parse方法会引发ParseException