How do I convert 2018-04-10T04:00:00.000Z string to DateTime?
我从一个JSONAPI得到一个日期,它看起来像"2018-04-10t04:00:00.000z"。我想转换它以获得一个日期或字符串对象,并得到类似于"01-04-2018"的"dd-mm-yyyy"。我该怎么做?
- 使用SimpleDateFormat。
- 或使用Java 8日期API。不管怎样,这都是复制品。
- @阿文德,请不要教那些年轻人使用过时的、臭名昭著的、麻烦缠身的SimpleDateFormat课程。至少不是第一个选择。没有任何保留。今天,我们在EDCOX1的2个方面,现代Java日期和时间API以及它的EDOCX1 3个方面都有了更好的表现。是的,你可以在Android上使用。对于旧版Android,请参阅如何在Android项目中使用threetenabp。
- 发布前搜索堆栈溢出。您可以假设所有基本的日期时间问题都已被询问和回答。
更新:使用在Java 8中引入的EDCOX1 1Ω:
其思想是定义两种格式:一种用于输入格式,另一种用于输出格式。使用输入格式化程序进行分析,然后使用输出格式化程序进行格式化。
除了后面的Z,您的输入格式看起来相当标准。不管怎样,让我们来处理这个问题:"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"。尾随的'Z'是有趣的部分。通常这里有时区数据,比如-0700。所以模式应该是...Z,也就是说,没有撇号。
输出格式要简单得多:"dd-MM-yyyy"。注意小的ys。
下面是示例代码:
1 2 3 4 5
| DateTimeFormatter inputFormatter = DateTimeFormatter. ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale. ENGLISH);
DateTimeFormatter outputFormatter = DateTimeFormatter. ofPattern("dd-MM-yyy", Locale. ENGLISH);
LocalDate date = LocalDate. parse("2018-04-10T04:00:00.000Z", inputFormatter );
String formattedDate = outputFormatter. format(date );
System. out. println(formattedDate ); // prints 10-04-2018 |
原始答案-使用旧API SimpleDateFormat
- 请不要教年轻人使用过时的、臭名昭著的麻烦的SimpleDateFormat课程。至少不是第一个选择。没有任何保留。今天,我们在EDCOX1的0个方面,现代Java日期和时间API以及它的EDOCX1 4个方面都有了更好的表现。是的,你可以在Android上使用。对于旧版Android,请参阅如何在Android项目中使用threetenabp。
- 好的,先生,更新了答案。
- 承认和赞成,塔玛斯。作为输入格式化程序,您可以使用DateTimeFormatter.ISO_OFFSET_DATE_TIME,因此不需要自己滚动。
- 谢谢!这辆车很漂亮。不幸的是,这里不能使用,因为op的输入字符串中有文字Z。可能他们的系统的其他部分有格式化问题,这就是为什么它不是实时区域数据的原因。不管怎样,这是一个单独的问题。
- 以东十一〔8〕工作得很好,给了以东十一〔9〕。Z是一个完全有效的偏移量,广泛使用,而不是+00:00。
- 的确。我原以为它会像SimpleDateFormat那样工作。从对答案的评论中学习是很好的:)
- 根据ISO 8601的定义,Z表示日期/时间为UTC。正如Olevv所说,它可以在偏移量为零(+00:00)时使用。使用SimpleDateFormat和Z内引号使它将z解析为文本(字母z),而不是将其解析为零偏移量。问题是,在这种情况下,SimpleDateFormat将使用JVM默认时区,而Date将对应错误的时间点。
- 我不确定你是否可以一直依赖那些在Android中可用的更好的新Java日期实用程序。
- @Pyetti我不知道确切的限制,但据我所知,threetenabp库也适用于相当老的Android版本。您是对的,这些功能只是API级别26的内置功能,在这个级别下,您需要所提到的库。
使用日期模式EDCOX1、0和Java 8
1 2 3 4
| String string ="2018-04-10T04:00:00.000Z";
DateTimeFormatter formatter = DateTimeFormatter. ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale. ENGLISH);
LocalDate date = LocalDate. parse(string, formatter );
System. out. println(date ); |
更新:用于26岁之前的儿童使用JODA时间
1 2 3
| String string ="2018-04-10T04:00:00.000Z";
DateTimeFormatter formatter = DateTimeFormat. forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
LocalDate date = org. joda. time. LocalDate. parse(string, formatter ); |
在app/build.gradle文件中,像这样添加-
1 2 3
| dependencies {
compile 'joda-time:joda-time:2.9.4'
} |
- 很好,但这个调用需要我的Android应用程序的API级别26(当前最小值为15),我现在不想更改它。还有别的选择吗?
- 这将很好地适用于旧的安卓系统。关于26级之前的版本,请参见如何在Android项目中使用threetenabp。
- 因为字符串是ISO 8601格式,所以您甚至不需要显式格式化程序。java.time类将此格式作为默认格式进行解析。LocalDate date = OffsetDateTime.parse(string).toLocalDate()。
- 乔达时代是一个很好的图书馆。"佐达时间"被认为是一个基本上"完成"的项目。…如果使用JavaSE 8,请迁移到JavaTime(JSR-310)。所以我建议在乔达的时间内服用三乙胺。
- OLE V.V是正确的。joda time建议迁移到java.time。我以前没有机会使用三连珠,所以我不能说/建议。
- 这个答案忽略了ME区域的关键问题。在任何一个特定的时刻,日期在全球各地各不相同。