如何用date,时间和分钟获得ISO 8601格式的当前时刻?

世界标准时间(UTC),获得ISO 8601格式化表示的最优雅方式是什么? 它应该是这样的: 2010-10-12T08:50Z

使用SimpleDateFormat格式化所需的任何Date对象:

 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()将格式化当前时间。

对于默认时区不是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实例可能被声明为全局常量,但要注意这个类不是线程安全的。 如果multithreading同时访问,它必须同步。

编辑:我喜欢乔达时间,如果做很多不同的时代/date操纵…
EDIT2:更正: setTimeZone不接受一个string(由保罗纠正)

Java 8:

 thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX") .withZone(ZoneOffset.UTC) .format(Instant.now()); 

预Java 8:

 thisMoment = String.format("%tFT%<tRZ", Calendar.getInstance(TimeZone.getTimeZone("Z"))); 

从文档 :

'R'时间格式为24小时制为“%tH:%tM”
'F' F'ISO 8601完成date格式为“%tY-%tm-%td”。

Java 8 Native

自Java 8以来, java.time变得很简单,并且线程安全。

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

结果: 2015-04-14T11:07:36.639Z

您可能会尝试使用InstantLocalDateTimeTemporal LocalDateTime ,但缺less格式化程序支持或时区数据。 只有ZonedDateTime可以直接使用。

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

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

结果: 2015-04-14T11:07:00+01:00[Europe/Paris]

精确的要求,如删除秒部分,仍然必须由自定义格式或自定义后期处理。

对于Java 6和7,您可以考虑java.time的后端,如ThreeTen-Backport ,它也有一个Android端口 。 两人都比乔达轻,并从乔达的经验中学到了东西 – 尤其是, 考虑到java.time是由Joda的作者devise的。

使用JodaTime

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

这是JodaTime格式化工具的文档

编辑:

如果你不想添加,或者如果你没有看到添加上面的库的价值,你可以使用内置的SimpleDateFormat类来格式化date到所需的ISO格式

正如@Joachim Sauer所build议的那样

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

来自Apache commons-lang3 DateFormatUtils具有有用的常量,例如: DateFormatUtils.ISO_DATETIME_FORMAT

如果你不想包括Jodatime(尽可能好)

 javax.xml.bind.DatatypeConverter.printDateTime( Calendar.getInstance(TimeZone.getTimeZone("UTC")) ); 

它返回一个string:

 2012-07-10T16:02:48.440Z 

这与原始请求略有不同,但仍然是ISO-8601。

ISO 8601可能包含秒见http://en.wikipedia.org/wiki/ISO_8601#Times

所以代码应该是

 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 

乔达时间

更新: Joda-Time项目现在处于维护模式 ,团队build议迁移到java.time类。 对于Java 6和7,请参阅ThreeTenABP项目中进一步适用于Android的ThreeTen- Backport项目。

使用Joda时间库…

 String output = new DateTime( DateTimeZone.UTC ).toString() ; 

这是线程安全的。 Joda-Time创build新的不可变对象,而不是改变现有的对象。

如果你真的打算要求一个没有秒的格式,解决到分钟,然后使用乔达时间内的其他内置格式化之一。

 DateTime now = new DateTime( DateTimeZone.UTC ) ; String output = ISODateTimeFormat.dateHourMinute.print( now ) ; 

java.time

对于Java 8和更高版本,Joda-Time继续工作。 但是内置的java.time框架取代了Joda-Time。 因此,尽快将您的代码从Joda-Time迁移到java.time。

看到这个正确的答案为java.time ,由Sheepy 。

对于Java版本7

您可以按照Oracle文档: http : //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

X – 用于ISO 8601时区

 TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); df.setTimeZone(tz); String nowAsISO = df.format(new Date()); System.out.println(nowAsISO); DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); //nowAsISO = "2013-05-31T00:00:00Z"; Date finalResult = df1.parse(nowAsISO); System.out.println(finalResult); 

对于ISO 8601,可以使用Java的SimpleDateFormat ,格式为yyyy-MM-dd'T'HH:mm:ssXXX

示例代码:(列出所有可用的时区)

 for (String timeZone : TimeZone.getAvailableIDs()) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone)); String formatted = dateFormat.format(new Date()); System.out.print(formatted); if (formatted.endsWith("Z")) { // These time zone's have offset of '0' from GMT. System.out.print("\t(" + timeZone + ")"); } System.out.println(); } 

你可以使用:

TimeZone.getDefault()

为默认的VM时区。 更多在这里

您可能会注意到以'Z'结尾的几个时区的date时间。 这些时区与GMT的偏移量为'0'

更多信息可以在这里find。

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

 Instant.now().toString(); 

这是一个优化的整个类,以便调用“now()”不再需要做更多的事情。

 public class Iso8601Util { private static TimeZone tz = TimeZone.getTimeZone("UTC"); private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); static { df.setTimeZone(tz); } public static String now() { return df.format(new Date()); } } 

尽pipe如此,joda时间只支持扩展格式:“2015-12-09T00:22:42.930Z”不是基本的:“20151209T002242.930Z”…我们可能会更好用java SimpleDateFormattesting一系列格式。

我相信最简单的方法是先进入瞬间,然后再按string:

 String d = new Date().toInstant().toString(); 

这将导致:

2017-09-08T12:56:45.331Z

我在Android中使用Calendar和SimpleDateFormat。 以下方法返回带有“GMT”TimeZone(这是通用时区)的日历。 然后,您可以使用Calendar类来设置不同时区之间的小时,使用Calendar类的setTimeZone()方法。

 private static final String GMT = "GMT"; private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss"; public static Calendar isoToCalendar(final String inputDate) { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT)); try { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone(GMT)); Date date = dateFormat.parse(inputDate); calendar.setTime(date); } catch (ParseException e) { Log.e("TAG",e.getMessage()); } return calendar; } 

记住:Date类不知道TimeZone的存在。 由于这个原因,如果你debugging一个date,你总是看到你当前的时区的date。

 private static String getCurrentDateIso() { // Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return dateFormat.format(new Date()); } 

尝试这个,

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"); String date=sdf.format (new Date() ); 

其对于ISO 8601格式