我需要在ISO 8601中获取当前日期 SS毫秒和 HH:MM时区
完成日期加上小时,分钟,秒和小数部分 第二名:YYYY-MM-DDThh:mm:ss.sTZD(例如1997-07-16T19:20:30。 45 + 01:00 )
请参阅:http://www.w3.org/TR/NOTE-datetime
我尝试了不同的方法,但我无法获得正确的毫秒数和时间。时区数字:
DateFormat df=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSZZ");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
df.format(new Date());
JAVA结果: 2012-11-24T21:19:27。 758 + 0000
Apache结果: 2012-11-24T21:19:27。 758 + 00:00 (Apache Commons FastDateFormat)
答案 0 :(得分:6)
实际上JDK中有一个类来处理ISO8601的解析和格式化:
import javax.xml.bind.DatatypeConverter;
DatatypeConverter.printDateTime(new GregorianCalendar())
//2012-11-24T22:42:03.142+01:00
答案 1 :(得分:2)
使用java.time.Instant
捕获分辨率中的当前时刻,精确到纳秒。
Instant.now() // Capture the current moment in UTC, with a resolution as fine as nanoseconds. Typically captured in microseconds in Java 9 and later, milliseconds in Java 8.
.toString() // Generate a `String` representing the value of this `Instant` in standard ISO 8601 format.
2018-01-23T12:34:56.123456Z
最后的Z
:
如果出于某种不寻常的原因,您必须调整为特定的offset-from-UTC,请使用OffsetDateTime
,并传递ZoneOffset
。
OffsetDateTime.now( // Capture the current moment.
ZoneOffset.ofHours( 1 ) // View the current moment adjusted to the wall-clock time of this specific offset-from-UTC. BTW, better to use time zones, generally, than a mere offset-from-UTC.
)
.toString() // Generate a `String` in standard ISO 8601 format.
2018-07-08T21:13:10.723676 + 01:00
毫秒分辨率,truncate。按ChronoUnit
枚举指定分辨率。
OffsetDateTime.now(
ZoneOffset.ofHours( 1 )
)
.truncatedTo( // Lop off finer part of the date-time. We want to drop any microseconds or nanoseconds, so truncate to milliseconds. Using the immutable objects pattern, so a separate new `OffsetDateTime` object is generated based on the original object’s values.
ChronoUnit.MILLIS // Specify your desired granularity via `ChronoUnit` enum.
)
.toString()
2018-07-08T21:13:10.723 + 01:00
在解析或生成日期时间值的文本表示时,Java 8及更高版本中内置的java.time framework默认使用ISO 8601。
Instant
是UTC中时间轴上的一个时刻,分辨率为nanoseconds。
Instant instant = Instant.now();
当前时刻在Java 8中以毫秒的分辨率被捕获,在Java 9及更高版本中,通常是微秒的分辨率,具体取决于主机硬件时钟和OS的能力。如果您特别需要毫秒分辨率,请截断任何微秒或纳秒。
Instant instant = Instant.now().truncatedTo( ChronoUnit.MILLIS ) ;
但你想要一个特定的offset-from-UTC。因此,请指定ZoneOffset
以获得OffsetDateTime
。
ZoneOffset offset = ZoneOffset( "+01:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , offset );
同样,如果您特别需要毫秒分辨率而不是微秒或纳秒,则截断。
odt = odt.truncatedTo( ChronoUnit.MILLIS ) ; // Replace original `OffsetDateTime` object with new `OffsetDateTime` object based on the original but with any micros/nanos lopped off.
要生成ISO 8601字符串,只需致电toString
。
String output = odt.toString();
转储到控制台。请注意输出中小时如何向前滚动以调整+01:00
偏移量,并且甚至在午夜滚动,因此日期从12日变为13日。
System.out.println ( "instant: " + instant + " | offset: " + offset + " | odt: " + odt );
时刻:2016-04-12T23:12:24.015Z |偏移量:+01:00 | odt:2016-04-13T00:12:24.015 + 01:00
顺便说一句,最好使用一个时区(如果已知)而不仅仅是一个偏移量。时区是特定地区人民使用的偏移的过去,现在和将来变化的历史。
在java.time中,这意味着应用ZoneId
来获取ZonedDateTime
。
ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
或者跳过Instant
,作为捷径。
ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;
生成一个String
,以文本方式表示该ZonedDateTime
个对象的值。默认使用的格式是标准的ISO 8601格式,明智地扩展为在方括号中附加区域的名称。
zdt.toString():2018-07-08T22:06:58.780923 + 02:00 [欧洲/巴黎]
对于其他格式,请使用DateTimeFormatter
类。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。