将字符串转换为日期 - Java

时间:2017-06-17 20:26:23

标签: java string date simpledateformat

我已经实现了以下方法将String转换为Date,因为不推荐使用Date(String)构造函数:

private Date format(String inputString) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        try {
            return dateFormat.parse(inputString);
        } catch (ParseException e) {
            return new Date();
        }
    }

一个inputString样本为2017-06-01T01:00:00Z。但是,当我检查输出时,我发现异常处理程序已被触发并返回new Date(),这意味着我的模式出现了问题:"Jun 17, 2017 1:12:02 PM"

我对模式yyyy-MM-dd'T'HH:mm:ssZ缺少什么?

3 个答案:

答案 0 :(得分:4)

Z模式表示数字时区偏移。因此,此处所需的偏移量为+0000

X模式允许您使用Z等时区偏移。 (是的,这看似违反直觉,但你去了。)

Source

答案 1 :(得分:3)

我同意Joe C和Louis Wassermann的评论:如果有任何可能的话,请远离过时的Date课程。而且有。现代的替代课程更加方便和程序员友好。

此外,您的输入字符串在瞬间即时间点符合ISO 8601标准,因此精确地符合Instant类。不需要任何明确的格式化程序来解析它。我建议:

private static Instant parse(String inputString) {
    try {
        return Instant.parse(inputString);
    } catch (DateTimeParseException dtpe) {
        System.err.println("Parsing: " + dtpe);
        return Instant.now();
    }
}

使用如下方法,例如:

    String inputString = "2017-06-01T01:00:00Z";
    System.out.println(parse(inputString));

打印:

2017-06-01T01:00:00Z

嗯,这是你开始使用的相同字符串,因为Instant.toString()会产生相同的ISO 8601字符串。

我也承认scottb:我们有时需要与需要旧式Date实例的遗留代码进行互操作。如果是这种情况,请从Date.from(parse(inputString))生成一个。这将产生等于瞬间的Date(在我的计算机上打印为Thu Jun 01 03:00:00 CEST 2017,因为这恰好是我的时区)。在任何情况下,我都建议您在输入遗留代码之前的最后一刻转换为Date,以尽量减少您对其的使用。

只是为了实验,让我们尝试使用不正确的格式模式字符串和更新的DateTimeFormatter类:

    DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ").parse(inputString);

这会产生java.time.format.DateTimeParseException: Text '2017-06-01T01:00:00Z' could not be parsed at index 19。它试图对您有所帮助:2017-06-01T01:00:00Z的索引19就是Z所在的位置。正如另外两个答案所说,这正是格式模式与输入不匹配的地方。说实话,这只是很多例子中的一个例子,你可以从现代课程中获得更好的帮助,而不是从现代课程中获得更好的帮助。

答案 2 :(得分:1)

您的输入字符串中有一个文字Z,因此您也需要引用它(或使用X)。像,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

更好(正如评论中所指出的)

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");

另外,不要抛弃异常(至少打印堆栈跟踪)。在Java 8+中,您应该使用新的java.time类。这可能看起来像,

private static LocalDateTime format(String inputString) {
    String pattern = "yyyy-MM-dd'T'HH:mm:ssX";
    return LocalDateTime.from(DateTimeFormatter.ofPattern(pattern)
           .parse(inputString));
}