我得到的日期时间值为
created_at '2012-02-22T02:06:58.147Z'
Read-only. The time at which this task was created.
由Asana API给出
我使用Java 8
来解析日期时间,如下所示
import java.time.*;
import java.time.format.*;
public class Times {
public static void main(String[] args) {
final String dateTime = "2012-02-22T02:06:58.147Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SX");
final ZonedDateTime parsed = ZonedDateTime.parse(dateTime, formatter);
System.out.println(parsed);
}
}
当我运行这个程序时,我得到了以下错误
Exception in thread "main" java.time.format.DateTimeParseException: Text '2012-02-22T02:06:58.147Z' could not be parsed at index 21
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at Times.main(Times.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
什么不对?
5条答案
按热度按时间vuv7lop31#
默认的解析器可以解析您的输入,因此您不需要定制格式化程序和
按预期工作。
y0u0uwnf2#
如果您的输入总是使用“zulu”时区(“Z”= UTC),则可以使用
DateTimeFormatter.ISO_INSTANT
(隐式):如果时区不同,并且格式为“+01:00”或“+01:00:00”(如果不是“Z”),则可以使用
DateTimeFormatter.ISO_OFFSET_DATE_TIME
:如果两者都不是,则可以用构造
DateTimeFormatter.ISO_OFFSET_DATE_TIME
的相同方式构造DateTimeFormatter
。您当前的模式存在以下几个问题:
ResolverStyle.STRICT
);yyyy
代替uuuu
(yyyy
在严格模式下不起作用);hh
代替24小时HH
;S
,但是输入具有三个。db2dz4w83#
您最初的问题是错误的模式符号“h”,它代表时钟小时(范围1-12)。在本例中,缺少am-pm信息。更好的方法是使用the pattern symbol "H"(范围0-23的小时)。因此,模式应该如下所示:
uuuu-MM-dd 'T'HH:mm:ss.SSSX(最佳模式也适用于严格模式)
zvokhttg4#
以下几点对我很有效
并输出为
mctunoxg5#
java.time
API基于ISO 8601,因此您不需要DateTimeFormatter
来解析已经采用ISO 8601格式的日期-时间字符串(例如2012-02-22T02:06:58.147Z
)。你的模式有什么问题?
您的模式
yyyy-MM-dd'T'hh:mm:ss.SX
存在两个问题:1.它具有用于AM/PM时间的
h
,因此在24小时格式中,它是错误的小时符号。在24小时格式中,小时符号是H
。1.日期时间字符串的毫秒分辨率为秒的几分之一,但您只使用了一个
S
。若要匹配毫秒分辨率,模式应为SSS
。演示:
输出:
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。