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

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

我无法理解它是哪种标准格式,例如UTC或ISO_8601

同时以以下方式进行解析:

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();

}

但是它抛出以下异常:

java.text.ParseException: Unparseable date: "2018-01-30T23:59:59.000"

任何帮助表示赞赏。

回答:

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

System.out.println(dateTime);

打印:

2018-01-30T23:59:59

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

您正在使用的日期时间类SimpleDateFormatDate早已过时,尤其是前者特别麻烦。我建议您改为使用java.time现代Java日期和时间API。与之合作真是太好了。

A LocalDateTime是具有一天中的时间,没有时区或与UTC偏移的日期。它的单参数parse方法解析ISO

8601,这就是为什么不需要显式格式化程序的原因。

回答:

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

但是,解决此问题,您的代码将产生以下结果Date

周日2017年12月31日23:00:00

与预期的日期有一个月的距离,而分钟和秒数也丢失了。因为:

  • 大写字母YYYY是基于星期的年份,仅与星期数一起使用。您需要yyyy一年的小写字母。
  • 大写DD是一年中的一天。您需要dd在每月的某天使用小写字母。
  • 您正确使用大写字母MM表示月份。再尝试几分钟,将无法正常工作。也许您现在可以猜测:它是小写字母mm
  • 毫不奇怪,您需要小写ss几秒钟。
  • 使用MS毫秒很有趣。SimpleDateFormat将其作为M月份(我们已经有过两次),以大写S表示毫秒。取而代之的是,您需要SSS三位毫秒的大写字母。

回答:

  • Oracle教程:Date Time解释如何使用java.time
  • 维基百科文章:ISO 8601
  • Wikipedia article: Coordinated Universal Time on UTC

以上是 无法理解“ YYYY-MM-DDTHH:MM:SS”日期格式 的全部内容, 来源链接: utcz.com/qa/434372.html

回到顶部