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

时间:2016-01-28 17:27:26

标签: java android datetime iso8601

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

TL;博士

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个对象。

continent/region的格式指定proper time zone name,例如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。已经多次覆盖。

关于 java.time

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore