在Android中将"2018-02-02T06:54:57.744Z"字符串转换为日期

Zul*_*ain -3 java android iso8601

基本上我的日期字符串是ISO-8601日期字符串,所以我搜索了将ISO-8601日期字符串转换为日期,但解决方案很冗长.这是详细信息.

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

java.text.ParseException: Unparseable date: "2018-02-02T06:54:57.744Z"
Run Code Online (Sandbox Code Playgroud)

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

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

我也使用以下模式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'
Run Code Online (Sandbox Code Playgroud)

任何解决这个问题的方法.

Ali*_*jad 9

Z是时区.您必须在日期字符串的末尾添加时区,或者只是从格式中删除它:yyyy-MM-dd'T'HH:mm:ss

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

  • 感谢在模式中仅使用 yyyy-MM-dd'T'HH:mm:ss 解决问题。 (2认同)

Bas*_*que 8

tl;博士

Instant.parse( “2018-02-02T06:54:57.744Z” ) 
Run Code Online (Sandbox Code Playgroud)

时间

现代方法使用 java.time 类。

Instant是 的替代品java.util.Date,代表 UTC 时间线上的一个时刻。

您的输入字符串恰好符合 ISO 8601 标准。java.time 类在解析/生成字符串时默认使用标准格式。所以不需要指定格式模式。

Instant instant = Instant.parse( “2018-02-02T06:54:57.744Z” ) ;
Run Code Online (Sandbox Code Playgroud)

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

Date d = Date.from( instant ) ;
Run Code Online (Sandbox Code Playgroud)

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


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

从哪里获得 java.time 类?


Rat*_*pda 7

尝试这个

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);
Run Code Online (Sandbox Code Playgroud)

输出值

在此处输入图片说明

  • 感谢添加此行input.setTimeZone(TimeZone.getTimeZone(“ UTC”)); 给我正确的结果。 (2认同)