一、原因:今天在编写junit测试的时候发现有个日期一直显示解析失败(如下图),查看具体代码之后发现是日期格式的问题,日期格式是:
yyyy'-'MM'-'dd'T'HH':'mm':'ss
失败提示:
java.text.ParseException: Unparseable date: "2020-07-19 09:00:00"
at java.text.DateFormat.parse(Unknown Source)
at com.hkt.cch8.drgo.DrgoApplicationTests.main(DrgoApplicationTests.java:25)
二、原理:这个格式还是第一次见到,与平时的格式相比只是多了一个'T'
,我觉得这个应该是一个代表时间开始的标记。然后再官网上Combined date and time representations找到具体解析。官网上是英文的,翻译后如下:
单个时间点可以通过连接完整的日期表达式、字母“T”作为分隔符和有效的时间表达式来表示。例如,“2007-04-05T14:30”。如“200704051430”中所述,经双方同意,允许省略“T”字符。[31]ISO 8601中不允许使用空格等其他字符分隔日期和时间部分,但允许在其配置文件RFC 3339中使用。[32]
如果需要时区指示符,它将跟随合并的日期和时间。例如,“2007-04-05T14:30Z”或“2007-04-05T12:30-02:00”。
可以使用基本格式或扩展格式,但日期和时间必须使用相同的格式。日期表达式可以是日历、周或序数,并且必须使用完整的表示形式。时间可以用指定的降低精度的格式来表示。[17]
持续时间定义了一个时间间隔中的干预时间量,并用格式P[n]Y[n]M[n]DT[n]H[n]M[n]S或P[n]W表示。在这些表示中,[n]被后面的每个日期和时间元素的值替换。不需要前导零,但每个元素的最大位数应由通信方商定。大写字母P、Y、M、W、D、T、H、M和S是每个日期和时间元素的指示符,不会被替换。
P是放置在持续时间表示开始处的持续时间指示符(表示期间)。
Y是年数值之后的年份指示符。
M是月数值之后的月份指示符。
W是周数值之后的周指示符。
D是天数值后面的日期指示符。
T是表示的时间分量之前的时间指示符。
H是小时数值之后的小时指示符。
M是分钟数值之后的分钟指示符。
S是秒数值后面的第二个指示符。
例如,“P3Y6M4DT12H30M5S”表示“三年六个月四天十二小时三十分五秒”的持续时间。
如果日期和时间元素的值为零,则可以省略包括其指示符的日期和时间元素,并且为了降低精度,也可以省略低阶元素。例如,“P23DT23H”和“P4Y”都是可接受的持续时间表示。但是,必须至少存在一个元素,因此“P”在0秒的持续时间内不是有效的表示然而,“PT0S”或“P0D”都是有效的,并且表示相同的持续时间。
为了解决歧义,“P1M”是一个月的持续时间,“PT1M”是一分钟的持续时间(注意时间值前面的时间指示符T)。使用的最小值也可以有小数,如“P0.5Y”表示半年。小数可以用逗号或句号指定,如“P0,5Y”或“P0.5Y”。本标准不禁止持续时间表示中的日期和时间值超过其“结转点”,除非下文另有说明。因此,“PT36H”和“P1DT12H”可用于表示相同的持续时间。但请记住,当切换到夏令时时,“PT36H”与“P1DT12H”不同。
或者,基于组合的日期和时间表示的持续时间格式可以通过通信双方之间的协议以基本格式PYYYYMMDDThhmmss或扩展格式P[YYYY]-[MM]-[DD]T[hh]:[MM]:[ss]使用。例如,上面显示的第一个持续时间是“P0003-06-04T12:30:05”。但是,单个日期和时间值不能超过其模数(例如,不允许月值为13或小时值为25)。[33]
尽管标准将持续时间描述为时间间隔的一部分,下一节将对此进行讨论,但是持续时间格式(或其子集)被广泛使用,独立于时间间隔,就像java8 duration类一样。[34][35]
三、如何使用:
1. 如下:
public static void main(String[] args) {
try {
DateFormat startTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date startTime = startTimeFormat.parse("2020-07-19T09:00:00");
System.out.println("start time: "+startTime);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行结果为:
start time: Sun Jul 19 09:00:00 CST 2020