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

Java 在Android中将“2018-02-02T06:54:57.744Z”字符串转换为日期,java,android,iso8601,Java,Android,Iso8601,基本上,我的日期字符串是ISO-8601日期字符串,因此我搜索了将ISO-8601日期字符串转换为日期的方法,但解决方案很长。详情如下 我有一个字符串2018-02-02T06:54:57.744Z要将其转换为日期,但我得到错误: java.text.ParseException: Unparseable date: "2018-02-02T06:54:57.744Z" 我正在使用以下技术来实现这一点,但没有成功: SimpleDateFormat parser = new SimpleDat

基本上,我的日期字符串是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;
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'
我还在SimpleDataFormat中使用了以下模式,但没有成功:

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
        parser.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date parsed = parser.parse(utcDateString);
        return parsed;
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);
输出

试试这个

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+0200Z是时区。您必须在日期字符串的末尾添加时区,或者将其从格式:yyyy-MM-dd'T'HH:MM:ss中删除

带时区的正确日期字符串如下所示:2018-02-02T06:54:57.744+0200

tl;博士 java.time 现代方法使用java.time类

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

您的输入字符串恰好符合ISO 8601标准。默认情况下,java.time类在解析/生成字符串时使用标准格式。因此,无需指定格式化模式

Instant instant = Instant.parse( “2018-02-02T06:54:57.744Z” ) ;
最好完全避免麻烦的java.util.Date类。但是如果您坚持,可以使用添加到旧类中的新方法进行转换

Date d = Date.from( instant ) ;
对于早期的Android,请参阅ThreeTen Backport和ThreeTenABP项目

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android,该项目采用了上面提到的Three-Ten Backport。看见 tl;博士 java.time 现代方法使用java.time类

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

您的输入字符串恰好符合ISO 8601标准。默认情况下,java.time类在解析/生成字符串时使用标准格式。因此,无需指定格式化模式

Instant instant = Instant.parse( “2018-02-02T06:54:57.744Z” ) ;
最好完全避免麻烦的java.util.Date类。但是如果您坚持,可以使用添加到旧类中的新方法进行转换

Date d = Date.from( instant ) ;
对于早期的Android,请参阅ThreeTen Backport和ThreeTenABP项目

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

,及以后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android,该项目采用了上面提到的Three-Ten Backport。看见
感谢在模式中仅使用yyyy-MM-dd'T'HH:MM:ss解决问题。感谢在模式中仅使用yyy-MM-dd'HH:MM:ss解决问题。感谢添加此行input.setTimeZoneTimeZone.getTimeZoneUTC;给我正确的结果。@Zulqarain谢谢,很高兴帮助您。先生,谢谢您帮助我,但是Ali Behzadian Nejad首先回答,然后将模式替换为yyyy-MM-dd'T'HH:MM:ss给我正确的结果。您的回答更加详细和正确,我感谢您的时间。@Zulqarain如您所愿感谢。感谢添加此行input.setTimeZoneTimeZone.getTimeZoneUTC;给我正确的结果。@Zulqarain谢谢,很高兴帮助您。先生,谢谢您帮助我,但是Ali Behzadian Nejad首先回答,然后将模式替换为yyyy-MM-dd'T'HH:MM:ss给我正确的结果。你的答案更详细,更正确,我也很感激你的时间。@ Zulqarnain谢谢你的愿望。作为一个旁白,考虑扔掉长期过时和臭名昭著的麻烦的简单格式和朋友,并添加到你的Android项目中,以便使用JavaAtTimes,现代java日期和时间API。这是一个更好的工作。作为一个撇开考虑扔掉长期过时和臭名昭著的麻烦简单的格式和朋友,并添加到您的Android项目,以便使用javaTimet,t 他创建了现代Java日期和时间API。和你一起工作真是太好了。