将时间字符串转换为ISO 8601格式

Cod*_*key 7 java string time

我正在尝试以2015-08-20T08:26:21.000Z
到2015-08-20T08:26:21Z的格式创建字符串

我知道它可以通过一些字符串拆分技术来完成,但我想知道是否有一个优雅的解决方案(最小的代码更改).

以上两个都是时间字符串,我需要的最后一个是ISO 8601中的日期.http://tools.ietf.org/html/rfc3339#section-5.6

我尝试了一些类似的问题,比如在java中将日期字符串转换为毫秒,但它们实际上并没有解决目的.

还尝试使用:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
Run Code Online (Sandbox Code Playgroud)

但它仍然不执行任何String to String转换.收到以下错误:

23:04:13,829 WARN [RuntimeExceptionMapper]捕获到RuntimeException:{}:java.lang.IllegalArgumentException:无法将给定的Object格式化为Date

是否有人可以建议的图书馆?

谢谢.

Bas*_*que 10

TL;博士

Instant.parse( "2015-08-20T08:26:21.000Z" )
       .toString()
Run Code Online (Sandbox Code Playgroud)

2015-08-20T08:26:21Z

日期时间格式化程序

如果您要做的只是消除.000,则使用日期时间对象来解析输入字符串值,然后以不同的格式生成该日期时间值的新字符串表示.

ISO 8601

顺便说一句,如果这是你的目标,那么问题的标题就没有意义,因为第一句中提到的两个字符串都是有效的ISO 8601格式字符串.

  • 2015-08-20T08:26:21.000Z
  • 2015-08-20T08:26:21Z

java.time

Java 8及更高版本具有新的java.time包.这些新类取代了旧的java.util.Date/.Calendar和java.text.SimpleDateFormat类.那些旧课程令人困惑,麻烦和有缺陷.

瞬间

如果您想要的只是UTC时区,那么您可以使用Instant该类.此类表示沿时间线的点,而不考虑任何特定时区(基本上是UTC).

DateTimeFormatter.ISO_INSTANT

调用Instant toString使用DateTimeFormatter.ISO_INSTANT格式化程序实例生成日期时间值的String表示.此格式化程序自动灵活地关于小数秒.如果值有一整秒,则不会生成小数位(显然是问题想要的).对于小数秒,数字显示在3,6或9的组中,根据需要表示高达纳秒分辨率的值.注意:此格式可能超过ISO 8601毫秒限制(3位小数).

示例代码

以下是Java 8 Update 51中的一些示例代码.

String output = Instant.parse( "2015-08-20T08:26:21.000Z" ).toString( );
System.out.println("output: " + output );
Run Code Online (Sandbox Code Playgroud)

产量:2015-08-20T08:26:21Z

改为小数秒, .08

String output = Instant.parse( "2015-08-20T08:26:21.08Z" ).toString( );
Run Code Online (Sandbox Code Playgroud)

输出:2015-08-20T08:26:21.080Z

如果对UTC以外的任何时区感兴趣,请从中创建一个ZonedDateTime对象Instant.

ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , ZoneId.of( "America/Montreal" ) ) ;
Run Code Online (Sandbox Code Playgroud)