将字符串转换为日期 - Java

Converting String to Date - Java

我已经实现了以下方法将 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 我错过了什么?

您的输入字符串中有文字 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));
}

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

X 模式允许您使用时区偏移量,例如 Z。 (是的,这似乎违反直觉,但就是这样。)

Source

我同意 Joe C 和 Louis Wassermann 的评论:如果有任何办法,请远离早已过时的 Date class。还有。现代替代品 classes 非常方便,对程序员也很友好。

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

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 class:

    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 的位置。正如其他两个答案所说,这正是格式模式与输入不匹配的地方。相信我,这只是众多示例中的一个,您从现代 classes 获得的帮助比旧的更好。