在String中将字符串转换为日期“2016-01-28T12:08:47.676706-05:00”

问题描述 投票:0回答:2

我只想转换“2016-01-28T12:08:47.676706-05:00”,但获得例外。任何人都可以建议我使用DateFormat,如“yyyy-MM-dd HH:mm:ss.SSSZ”将字符串解析为Date。

java android datetime iso8601
2个回答
1
投票

我希望下面的代码可以帮到你

String dateString = "2016-01-28T12:08:47.676706-05:00";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.getDefault());
format.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = format.parse(dateString);

0
投票

tl;dr

OffsetDateTime.parse( "2016-01-28T12:08:47.676706-05:00" )

java.time

使用现代java.time类来取代麻烦的遗留日期时间类。

遗留类的分辨率仅限于毫秒,而java.time类的分辨率更高,为纳秒级。这对于输入字符串中的微秒来说已经足够了。

您的输入符合标准ISO 8601格式。在解析/生成字符串时,java.time类默认使用标准格式。因此,根本不需要指定格式化模式。

我们将您的输入解析为OffsetDateTime,因为它包含来自UTC的偏移但不包括时区。

OffsetDateTime odt = OffsetDateTime.parse( "2016-01-28T12:08:47.676706-05:00" ) ;

odt.toString():2016-01-28T12:08:47.676706-05:00

要查看与UTC值相同的时刻,请提取Instant

Instant instant = odt.toInstant() ;

instant.toString():2016-01-28T17:08:47.676706Z

或调整到时区,以获得ZonedDateTime对象。

proper time zone name的格式指定continent/region,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

zdt.toString():2016-01-29T06:08:47.676706 + 13:00 [太平洋/奥克兰]

要以其他格式生成字符串,请搜索DateTimeFormatter类的Stack Overflow。已经多次覆盖。


About java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在Joda-Timemaintenance mode项目建议迁移到java.time班。

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

© www.soinside.com 2019 - 2024. All rights reserved.