这是什么日期格式?2011-08-12T10:17:46.384Ztl;博士国际标准化组织 ISO 8601java.time关于 java.time

2022-08-31 04:14:26

我有以下日期:.这是什么格式?我正在尝试通过Java 1.4解析它,并且我得到了2011-08-12T20:17:46.384ZDateFormat.getDateInstance().parse(dateStr)

java.text.ParseException: Unparseable date: “2011-08-12T20:17:46.384Z”

我认为我应该使用SimpleDateFormat进行解析,但我必须首先知道格式字符串。到目前为止,我所掌握的只是,因为我不知道这个字符串中的含义 - 与时区有关的东西?此日期字符串来自文件 CMIS 下载历史记录媒体类型上显示的标记。yyyy-MM-ddTlcmis:downloadedOn


答案 1

T只是一个文字,用于将日期与时间分开,Z表示“零小时偏移量”,也称为“祖鲁时间”(UTC)。如果您的字符串始终具有“Z”,则可以使用:

SimpleDateFormat format = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

或者使用Joda Time,您可以使用ISODateTimeFormat.dateTime()


答案 2

tl;博士

输入字符串使用标准 ISO 8601 格式。

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

国际标准化组织 ISO 8601

这种格式由合理的实用标准ISO 8601定义。

将日期部分与时间部分分开。末尾表示 UTC(即,从 UTC 的偏移量为零小时-分钟-秒)。发音为“祖鲁语”。TZZ

java.time

与最早的Java版本捆绑在一起的旧日期时间类已被证明设计不佳,令人困惑且麻烦。避免它们。

相反,请使用 Java 8 及更高版本中内置的 java.time 框架。java.time类取代了旧的日期时间类和非常成功的Joda-Time库。

默认情况下,java.time 类在解析/生成日期时间值的文本表示形式时使用 ISO 8601

Instant 类以 UTC 格式表示时间轴上的某个时刻,分辨率为纳秒。该类可以直接解析输入字符串,而无需费心定义格式设置模式。

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

Table of date-time types in Java, both modern and legacy


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.timejava.sql.*

从哪里获取 java.time 类?

Table of which java.time library to use with which version of Java or Android