获得ISO 8601格式的当前时刻UTC的最优雅的方式是什么?它看起来应该像:2010-10-12 t8: 50z。

例子:

String d = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);

当前回答

对于默认时区不是UTC的系统:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

如果经常需要,可以将SimpleDateFormat实例声明为全局常量,但要注意该类不是线程安全的。如果被多个线程并发访问,则必须进行同步。

编辑:我更喜欢Joda时间,如果做许多不同的时间/日期操作… EDIT2:更正:setTimeZone不接受字符串(由Paul更正)

其他回答

Java 8原生

java。从Java 8开始,时间让它变得简单。线程安全。

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

结果:2015 - 04 - 14 - t11:07:36.639z

你可能会想使用更轻的时间,如即时或LocalDateTime, 但它们缺乏格式化程序支持或时区数据。 只有zone datetime可以开箱即用。

通过调优或链接zoneeddatetime和DateTimeFormatter的选项/操作,您可以在一定程度上轻松控制时区和精度:

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

结果:2015 - 04 - 14 - t11:07:00 + 01:00(欧洲/巴黎)

细化的要求,如删除秒部分,仍然必须通过自定义格式或自定义post流程提供服务。

.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07

对于Java 6和7,您可以考虑Java的后端端口。比如ThreeTen-Backport,它也有一个Android端口。 两者都比Joda轻,并从Joda的经验中学习-特别是考虑到java。时间是由Joda的作者设计的。

Apache common -lang3中的DateFormatUtils有一些有用的常量,例如:ISO_DATETIME_FORMAT

从Java 8开始,你可以简单地做:

Instant.now().toString();

来自java.time.Instant文档:

现在 公共静态即时现在() 从系统时钟中获取当前时刻。 这将查询系统UTC时钟以获得当前时刻。

 

toString toString() 使用ISO-8601表示法的该瞬间的字符串表示法。 使用的格式与DateTimeFormatter.ISO_INSTANT相同。

使用JodaTime

ISO 8601日历系统是Joda-Time中的默认实现

下面是JodaTime Formatter的文档

编辑:

如果你不想添加或者如果你看不到添加以上库的价值,你可以使用内置SimpleDateFormat类将日期格式化为所需的ISO格式

正如@Joachim Sauer所建议的

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());

使用SimpleDateFormat格式化任何日期对象:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

如上所示,使用new Date()将格式化当前时间。