SimpleDateFormat:意外结果和意外的解析异常

时间:2015-08-13 15:32:26

标签: java date parsing simpledateformat

我在简单的日期格式方面遇到了很大的困难。首先,我知道并非所有网站上的所有教程都是好的,但事实上所有非平凡的格式(不是dd / MM / yyyy)给出了一个解析异常(加上我自己的测试不能按预期工作)对我来说是相当令人沮丧的。

这是相关网站:http://www.mkyong.com/java/how-to-convert-string-to-date-java/

我不明白为什么这么简单:

private static void unexpectedFailure() {
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
    String dateInString = "7-Jun-2013";

    try {

        Date date = formatter.parse(dateInString);
        System.out.println(date);
        System.out.println(formatter.format(date));

    } catch (ParseException e) {
        e.printStackTrace();
    }
}

抛出一个解析异常。

除此之外,我还试图解析自己的约会。这段代码给出了奇怪的结果(我想说的意外):

public static void doSomething(List<String> list) { 
    Iterator<String> iter = list.iterator();
    String[] line = iter.next().split(" ");
    System.out.println(Arrays.toString(line));
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
    format.setLenient(true);


    try {
        System.out.println(line[0]+" "+line[1]);
        System.out.println(format.parse(line[0]+" "+line[1]));
    } catch (ParseException e) {
        System.out.println("In theory this should not get caught.");
    }
}

打印出来:

[06/08/2015, 13:51:29:849, DEBUG, etc...]
06/08/2015 13:51:29:849
Thu Aug 06 13:51:29 EEST 2015

Thu Aug 06 13:51:29 EEST 2015什么?为什么?

编辑我会尝试解释。在我的上一段代码片段中,我只想确定字符串是否为日期,然后通过&#34;测试&#34;。然而,当我将它打印出来时,这种格式简直就是古怪。我开始认为这是因为我打印了一个约会。我怎么能打印DateFormat?我期待的是dd/MM/yyyy hh:mm:ss而非ddd MMM 06? hh:mm:ss G YYYY

1 个答案:

答案 0 :(得分:3)

  

我不明白为什么这么简单:
  (代码剪断)
  抛出一个解析异常。

我的猜测是,它在Jun上绊倒,这可能不是系统默认语言环境中的有效月份缩写。我建议您在SimpleDateFormat构造函数中指定区域设置:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);

然后你正在处理一个肯定具有Jun月份缩写的语言环境。

那就是说,在可能的情况下,我建议在可能的地方使用数字格式,理想情况下是符合ISO-8601的格式,例如

yyyy-MM-dd'T'HH:mm:ss
  

然而,当我将它打印出来时,这种格式很简单。

不,不是。你正在有效地使用

Date date = format.parse(line[0]+" "+line[1]);
System.out.println(date);

因此,我们将Date.toString()documented称为:

  

将此Date对象转换为以下形式的字符串:

dow mon dd hh:mm:ss zzz yyyy

这样按预期工作。但是,您希望使用SimpleDateFormat 格式化日期 - 因此您需要致电format

System.out.println(format.format(date));

当然,只是检查它是否可以往返。

作为旁注,我怀疑你的格式字符串中需要HH(24小时制)而不是hh(12小时制)。