无法理解" YYYY-MM-DDTHH:MM:SS"日期格式

时间:2018-05-10 10:54:28

标签: java simpledateformat

我正在尝试解析以下日期时间字符串

2018-01-30T23:59:59.000

我无法理解它是UTC或ISO_8601

的标准格式

以下列方式解析:

EXECUTE AS

但它抛出以下异常:

SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD'T'HH:MM:SS:MS");
        Date date = null;
        try {
            date = sdf.parse("2018-01-30T23:59:59.000");
        } catch (ParseException e) {
            e.printStackTrace();
        }

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

    LocalDateTime dateTime = LocalDateTime.parse("2018-01-30T23:59:59.000");
    System.out.println(dateTime);

打印:

  

2018-01-30T23:59:59

您的字符串采用ISO 8601格式。 UTC或协调世界时不是一种格式,它是用于定义在我们各自时区使用其余时间的标准时间。

您使用的日期时间类SimpleDateFormatDate已经过时了,前者尤其出了名的麻烦。我建议您使用现代Java日期和时间API java.time。与它合作非常好。

LocalDateTime是一个带有时间的日期,没有时区或与UTC的偏移。它的单参数parse方法解析ISO 8601,这就是不需要显式格式化的原因。

您的代码出了什么问题

您的格式模式字符串有很多问题。这就是为什么你应该在没有任何明确的格式化程序的情况下欣赏上述解决方案首先出现的问题是:格式模式字符串的冒号为:,介于秒和毫秒之间,而日期时间字符串有一个点.。这就是你得到例外的原因。

但是,修复此问题后,您的代码会产生以下Date

  

Sun Dec 31 23:00:00 CET 2017

距预期还有一个月,而且会议纪要和秒数都没有了。这是因为:

  • 大写YYYY是基于周的年份,仅适用于周数。您需要年份小写yyyy
  • 大写DD是一年中的某一天。每月需要小写dd
  • 您正确使用了大写MM月份。再次尝试相同的几分钟将无法正常工作。也许你现在可以猜到:它是小写的mm
  • 毫不奇怪,你需要小写ss秒。
  • 使用MS毫秒是很有趣的。 SimpleDateFormatM作为月份(我们之前已经有过两次),大写S为毫秒。相反,你需要大写SSS三位数毫秒。

链接