将“2018-02-02T06:54:57.744Z”字符串转换为 Android 中的日期

Convert "2018-02-02T06:54:57.744Z" String to date in Android

基本上我的日期字符串是ISO-8601日期字符串,所以我搜索了将ISO-8601日期字符串转换为日期的方法,但解决方案很长。详情如下。

我有一个字符串 2018-02-02T06:54:57.744Z 想将其转换为日期,但出现错误:

java.text.ParseException: Unparseable date: "2018-02-02T06:54:57.744Z"

我正在使用以下技术来做到这一点,但没有成功:

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
        parser.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date parsed = parser.parse(utcDateString);
        return parsed;

我也在 SimpleDateFormat 中使用了以下模式,但没有成功:

yyyy-MM-dd'T'HH:mm:ss.SSSZ
yyyy-MM-dd HH:mm:ss.S
yyyy-MM-dd'T'HH:mm:ssX
yyyy-MM-dd'T'HH:mm'Z'

这个问题的任何解决方案。

试试这个

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
SimpleDateFormat output = new SimpleDateFormat("dd/MM/yyyy");

Date d = null;
try 
{
   d = input.parse("2018-02-02T06:54:57.744Z");
} 
catch (ParseException e) 
{
   e.printStackTrace();
}
String formatted = output.format(d);
Log.i("DATE", "" + formatted);

输出

Z 是时区。您必须在日期字符串的末尾添加时区或简单地将其从格式中删除:yyyy-MM-dd'T'HH:mm:ss

带时区的正确日期字符串是这样的:2018-02-02T06:54:57.744+0200

tl;博士

Instant.parse( “2018-02-02T06:54:57.744Z” ) 

java.time

现代方法使用 java.time classes.

Instantjava.util.Date 的替代品,代表 UTC 时间轴上的一个时刻。

您输入的字符串恰好符合 ISO 8601 标准。当 parsing/generating 字符串时,java.time classes 默认使用标准格式。因此无需指定格式化模式。

Instant instant = Instant.parse( “2018-02-02T06:54:57.744Z” ) ;

最好完全避免麻烦 java.util.Date class。但如果您坚持,请使用添加到旧 classes 的新方法进行转换。

Date d = Date.from( instant ) ;

对于早期的 Android,请参阅 ThreeTen-BackportThreeTenABP 项目。


关于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