如何用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
您可能会尝试使用
Instant
或LocalDateTime
等Temporal
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格式