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

Convert String to Date "2016-01-28T12:08:47.676706-05:00" in android

我只是想转换“2016-01-28T12:08:47.676706-05:00”但出现异常。谁能建议我像 "yyyy-MM-dd HH:mm:ss.SSSZ" 这样的 DateFormat 来将字符串解析为 Date.

希望下面的代码对您有所帮助

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);

tl;博士

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

java.time

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

旧版 classes 仅限于毫秒分辨率,而 java.time classes 具有更精细的分辨率,纳秒级。这对于输入字符串中的微秒来说绰绰有余。

您的输入符合标准 ISO 8601 格式。当 parsing/generating 字符串时,java.time classes 默认使用标准格式。所以根本不需要指定格式模式。

我们将您的输入解析为 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 in the format of continent/region, such as America/Montreal, Africa/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们 不是 真正的时区,不是标准化的,甚至不是唯一的(!)。

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

zdt.toString(): 2016-01-29T06:08:47.676706+13:00[Pacific/Auckland]

要生成其他格式的字符串,请在 Stack Overflow 中搜索 DateTimeFormatter class。已经覆盖很多次了。


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的Android,ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.