如何获得ISO 8601格式的当前时刻,包括日期,小时和分钟?

yeg*_*256 302 java

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

例:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 276

使用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());
Run Code Online (Sandbox Code Playgroud)

使用new Date()如上所示的格式化当前时间.

  • -1这将为您提供当前时区的日期/时间 - 而不是UTC.Carlos的回答包括必要的UTC代码. (33认同)
  • 我刚刚修正了时区错误 - 因为这是接受的答案,我认为这是正确的做法. (13认同)
  • @Joachim这种"标准"方法的消极方面是,每次我需要ISO-8601格式的日期时,我的应用程序中必须有许多"yyyy-MM-dd'T'HH:mmZ"的实例.有了JodaTime,正如我所见,我可以使用预定义的格式化程序`ISODateTimeFormat`,它为我做这个工作.. (8认同)
  • @Joachim,`Z`是SimpleDateFormat中的有效模式,而不是这样做:`yyyy-MM-dd'T'HH:mm'Z'`. (8认同)
  • Z需要引用像"yyyy-MM-dd'T'HH:mm'Z'" (2认同)

use*_*421 220

对于默认时区不是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());
Run Code Online (Sandbox Code Playgroud)

SimpleDateFormat,如果经常需要的情况下可以声明为一个全局常量,但要注意,这个类不是线程安全的.如果多个线程同时访问它必须同步.

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

  • 在某些内置库中,这种格式不是常量吗? (6认同)
  • 如果你想要当前时区使用TimeZone tz = TimeZone.getDefault(); 代替 (3认同)

She*_*epy 159

Java 8 Native

Java.time使Java 8变得简单.并且线程安全.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
Run Code Online (Sandbox Code Playgroud)

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

您可能会喜欢使用或Temporal等较轻的打印机,但它们缺少格式化程序支持或时区数据.只开箱即用.InstantLocalDateTimeZonedDateTime

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

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )
Run Code Online (Sandbox Code Playgroud)

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

精简要求(例如删除秒部分)仍必须由自定义格式或自定义后期处理提供.

.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
Run Code Online (Sandbox Code Playgroud)

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

  • 好答案.注意*明确*指定时区而不是隐含地依赖于JVM当前默认时区的良好习惯.如果需要,您可以指定[特定时区](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones),例如`ZoneId.of("America/Montreal")`. (7认同)
  • 警告:使用ISO_INSTANT的Java 8解决方案有一个令人讨厌的怪癖。当毫秒恰好为0时,它们不包含在输出中。根据ISO 8601标准,这是允许的,但是许多其他语言的库和解析器并不那么宽容。如果有必要始终包含零,请改用它:DateTimeFormatter ISO_8601 = ofPattern(“ yyyy-MM-dd'T'HH:mm:ss.SSSX”)。withZone(UTC); (6认同)
  • Instant 允许通过调用 .toString() 方法将其格式化为 ISO 8601 格式:`return DateTimeFormatter.ISO_INSTANT.format(this);` (2认同)
  • 从 Java 8 切换到 11 后,我看到 `DateTimeFormatter.ISO_INSTANT` 和 `DateTimeFormatter.ISO_DATE_TIME` 在秒后使用 6 位数字,而不是 3,Spring 的 `@DateTimeFormat(iso = DateTimeFormat.ISO 不再使用 3 位数字) .DATE_TIME)`。 (2认同)

aio*_*obe 124

Java 8:

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

前Java 8:

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));
Run Code Online (Sandbox Code Playgroud)

来自文档:

'R'    格式化为24小时制的时间为"%tH:%tM"
'F'    ISO 8601完整日期格式为"%tY-%tm-%td".

  • 好吧,要么你包括一个额外的第三方库作为你项目的依赖(你可能想要保持最新,并附带你的应用程序,嘿,它只是一个额外的3.2兆字节)并做`DateTime dt = new约会时间(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);`,或者你将`return String.format("%tFT%<tRZ",new Date());`封装成一个类,然后执行`str = Iso8601Time.now( )`,你需要它的地方.(这不像ISO格式会改变.)如果事实证明您需要的不仅仅是ISO格式的当前日期,请使用lib. (26认同)
  • `%tFT%<tTZ`将包括秒; `%tFT%<tTZ.%<tL`将包括毫秒. (6认同)
  • 请注意,可以更改哪个答案被标记为已接受;-) (3认同)
  • @PatrickLinskey 有一个有用的注释,可以将秒和毫秒添加到输出中,但是毫秒的模式有一个小错误。Z 应该出现在像这样的毫秒之后`%tFT%&lt;tT.%&lt;tLZ` (3认同)
  • 完全同意这一点. (2认同)
  • 一个非常简洁的解决方案,应该是现在接受的答案:) (2认同)
  • `DateTimeFormatter`具有常量`ISO_DATE_TIME`来获取ISO-8601日期格式化程序,而不是自己明确地编写模式. (2认同)

小智 75

从Java 8开始,您可以简单地执行:

Instant.now().toString();
Run Code Online (Sandbox Code Playgroud)

来自java.time.Instant文档:

现在

public static Instant now()

从系统时钟获取当前瞬间.

这将查询系统UTC时钟以获取当前时刻.

 


public String toString()

使用ISO-8601表示的此瞬间的字符串表示.

使用的格式与DateTimeFormatter.ISO_INSTANT.

  • 这是正确的答案,这是一个丑闻,它并没有被所有这些炮制的'SimpleDateFormats`所取代. (7认同)

Jig*_*shi 26

使用JodaTime

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

是JodaTime Formatter的文档

编辑:

如果您不想添加或者如果您没有看到添加上面库的价值,您可以在构建SimpleDateFormat类中使用将Date格式化为所需的ISO格式

正如@Joachim Sauer所建议的那样

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

  • @aioobe jodatime在任何情况下都更好,因为它有`ISODateTimeFormat` - ISO-8601的预定义格式化程序. (5认同)
  • 我要说的是不要为这样简单的东西添加库依赖(这可以用两行java代码实现).(当然,如果需求增长,这是另一个故事.) (4认同)
  • 如何生成如问题中所示的格式化字符串? (3认同)
  • @ org.life.java:只有在你可以正确切换到Jode时间时才有意义.当你只使用Joda时间的这个功能时,你将不会拥有它们. (3认同)

yeg*_*256 20

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

  • 更准确地说,UTC中的当前时刻:`DateFormatUtils.format(new Date(),"yyyy-MM-dd'T'HH:mm'Z'",TimeZone.getTimeZone("UTC"));`当前时刻默认时区:`DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date())`; @ yegor256感谢提到`DateFormatUtils`,有了apache commons-lang,值得使用日期格式. (3认同)

Mat*_*ett 18

如果你不想包括Jodatime(虽然它很好)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);
Run Code Online (Sandbox Code Playgroud)

返回一个字符串:

2012-07-10T16:02:48.440Z
Run Code Online (Sandbox Code Playgroud)

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


okw*_*wap 16

ISO 8601可能包含秒,请参阅http://en.wikipedia.org/wiki/ISO_8601#Times

所以代码应该是

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


Bas*_*que 10

乔达时间

更新:乔达时间的项目现在处于维护模式,与团队的建议迁移java.time类.对于Java 6和7,请参阅ThreeTen- Backport项目,该项目在ThreeTenABP项目中进一步适用于Android .

使用Joda-Time库...

String output = new DateTime( DateTimeZone.UTC ).toString() ;
Run Code Online (Sandbox Code Playgroud)

这是线程安全的.Joda-Time创建新的不可变对象而不是更改现有对象.

如果你真的想要一个没有秒的格式,解析为几分钟,那么使用Joda-Time中的许多其他内置格式化程序之一.

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
Run Code Online (Sandbox Code Playgroud)

java.time

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

请参阅我的其他答案,了解现代解决方案


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Bas*_*que 10

tl;博士

其他一些答案在推荐java.time类时是正确的,但会根据您的特定需求使用不必要的长度。

Instant.now()                               // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
       .truncatedTo( ChronoUnit.MINUTES )   // Lop off any seconds or fractional second, to get a value in whole minutes.
       .toString()                          // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
Run Code Online (Sandbox Code Playgroud)

2018-01-23T12:34Z

Instant::toString

jav.time.Instant类表示UTC片刻,总是在UTC。

Instant instant = Instant.now() ;
Run Code Online (Sandbox Code Playgroud)

Instant.toString(): 2018-01-23T12:34:56.123456Z

Z您的例子字符串的结尾2010-10-12T08:50Z的发音是“祖鲁”和指UTC

您想要的格式恰好符​​合ISO 8601标准。所述java.time类解析/生成字符串时默认使用这些标准格式。所以不需要指定格式模式。只需调用Instant::toString如上所示。

如果您特别想要没有秒或小数秒的整分钟,请截断。通过ChronoUnit类指定时间单位。

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

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

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

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

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


d.d*_*lov 7

对于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);
Run Code Online (Sandbox Code Playgroud)


alw*_*arn 5

您可以将Java的SimpleDateFormatyyyy-MM-dd'T'HH:mm:ssXXXISO 8601 的以下模式一起使用.

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

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();
}
Run Code Online (Sandbox Code Playgroud)

你可以使用:

TimeZone.getDefault()

对于默认的vm时区.更多这里

您可能会注意到以少数时区结束的日期时间'Z'.这些时区'0'与GMT 相抵.

更多信息可以在这里找到.


Tun*_*ğlu 5

我相信最简单的方法是首先进入即时,然后串起来:

String d = new Date().toInstant().toString();
Run Code Online (Sandbox Code Playgroud)

这将导致:

2017-09-08T12:56:45.331Z

  • 如果你想要当前的时间,就没有必要经历一个老式的`Date`对象.只需执行`Instant.now().toString()`.如果您从遗留API获得"日期",那么您的方法是最好的. (3认同)