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

Java 如何获得ISO 8601格式的当前时刻,包括日期、小时和分钟?,java,Java,获取当前UTC格式演示文稿的最优雅方式是什么?它应该是这样的:2010-10-12T08:50Z 例如: String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date); 使用 ISO 8601日历系统是Joda时间内的默认实现 是JodaTime格式化程序的文档 编辑: 如果您不想添加或看不到添加上述库的价值,您可以使用内置的SimpleDateFormat类将日期格式化为所需的ISO格式 正

获取当前UTC格式演示文稿的最优雅方式是什么?它应该是这样的:
2010-10-12T08:50Z

例如:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
使用

ISO 8601日历系统是Joda时间内的默认实现

是JodaTime格式化程序的文档

编辑:

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

正如@Joachim Sauer所建议的

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new 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());

使用如上所示的
新日期()
将格式化当前时间。

Java8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());
thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

前Java 8:

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());
thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

thismome=String.format(“%tFT%”,适用于默认时区不是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());
如果经常需要,可以将
SimpleDataFormat
实例声明为全局常量,但请注意此类不是线程安全的。如果由多个线程并发访问,则必须对其进行同步

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

试试这个

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

如果您不想包含Jodatime(尽管它很好),它适用于ISO 8601格式

返回以下字符串:

2012-07-10T16:02:48.440Z

这与最初的请求略有不同,但仍然是ISO-8601。

这里有一个经过优化的完整类,这样调用“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());
    }
}

从Apache
commons-lang3
中有有用的常量,例如:
DateFormatUtils.ISO_DATETIME_FORMAT
iso8601可能包含秒 看

所以代码应该是

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
对于Java版本7

您可以遵循Oracle文档:

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);
乔达时间 更新:项目现在已经开始,团队建议迁移到类。关于Java 6和7,请参阅项目中的项目,该项目进一步适用于Android

使用图书馆

String output = new DateTime( DateTimeZone.UTC ).toString() ;
这是线程安全的。Joda Time创建新对象而不是更改现有对象

如果您真的想要请求一种没有秒的格式,解析为分钟,那么使用Joda Time中的许多其他内置格式化程序之一

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
java.time 对于Java 8和更高版本,Joda Time仍然有效。但是内置框架取代了Joda Time。因此,请尽快将代码从Joda Time迁移到Java.Time

有关现代解决方案,请参阅


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
classes

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(Java8本机) 使它变得简单,因为Java8.0和线程安全

      ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
      
      结果:
      2015-04-14T11:07:36.639Z

      您可能会尝试使用更轻的
      时态
      ,例如
      即时
      本地日期时间
      , 但它们缺乏格式化程序支持或时区数据。 只有
      zoneDateTime
      是现成的

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

      ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
                   .truncatedTo( ChronoUnit.MINUTES )
                   .format( DateTimeFormatter.ISO_DATE_TIME )
      
      结果:
      2015-04-14T11:07:00+01:00[欧洲/巴黎]

      细化的需求,例如删除秒部分,仍然必须通过自定义格式或自定义后期处理来满足

      .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
      
      6和7,可以考虑Java.Time: 两者都比Joda轻,并且从Joda的-esp.中学习到java.time是由Joda的作者设计的


      从Java 8开始,您只需执行以下操作:

      Instant.now().toString();
      
      从文档中:


      publicstaticinstantnow()

      从系统时钟获取当前时刻

      这将查询以获取当前即时信息


      公共字符串toString()

      使用ISO-8601表示法的该瞬间的字符串表示法

      使用的格式与相同

      对于ISO 8601,您可以将Java与以下模式一起使用
      yyyy-MM-dd'HH:MM:ssXXX

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

      您可以使用:

      TimeZone.getDefault()

      用于默认vm时区。详细信息

      您可能会注意到一些以
      'Z'
      结尾的时区的日期时间。这些时区的偏移量为
      '0'


      可以找到更多信息。

      不过,joda time只支持扩展格式: “2015-12-09T00:22:42.930Z” 不是基本的: “20151209T002242.930Z”
      …我们最好使用java SimpleDateFormat测试一系列格式。

      我在Android中使用Calendar和SimpleDateFormat进行了测试。以下方法返回带有“GMT”时区的日历(这是通用时区)。然后,您可以使用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类没有
      String d = new Date().toInstant().toString();
      
      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());
      }
      
      Instant.ofEpochMilli(date.getTime()).toString();
      
      DateTimeFormatter.ISO_DATE_TIME
              .withZone(ZoneOffset.UTC)
              .format(yourDateObject.toInstant())
      
      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.
      
      Instant instant = Instant.now() ;
      
      Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
      String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.