Java 无法解析的日期 : different number of characters in ms value

标签 java date-format

我有一个工作流程,需要将日期值作为输入,对其进行编辑并以精确格式传递到输出。 为了管理这个任务,我使用这个:

 TimeZone tz = TimeZone.getTimeZone("UTC");
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
 df.setTimeZone(tz);
 long date = df.parse(inputDate).getTime() + 1;
 outputDate = df.format(date).toString();

大多数时候这段代码都可以正常工作。但是,有时我会得到这样的输入日期:

2016-05-25T22:00:10.6Z 

请注意 ms 的字符数,它是 1,而不是 3。

在上面的情况下,我得到了异常(exception):

java.text.ParseException: Unparseable date: "2016-05-25T22:00:10.6Z"
            at java.text.DateFormat.parse(DateFormat.java:366)

我无法影响输入日期,但我需要毫秒部分的三个数字。我如何获得它?

最佳答案

对于解析,实际上您只能指定一个字母(对于每个字段),如下所示:

DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.SX");
// "2016-5-25T22:0:10.6Z" input is acceptable
// "2016-05-25T22:00:10.6Z" input is acceptable
// "2016-05-25T22:00:10.678Z" input is NOT acceptable

解析时它接受多个数字(每个字段);这意味着模式字母的数量对于解析来说并不重要(但对于格式化来说很重要)。因此,像 "2016-05-25T22:00:10.6Z" 这样的输入对于上面的模式是可以接受的。

但是,Java 8 中似乎存在一些实现问题(我不太清楚),或者可能有一些未记录的内容,因此模式中的连续毫秒和时区(例如 SXSSSX )并不是那么简单。我的意思是"2016-05-25T22:00:10.678Z"上面的模式 Not Acceptable ,但不连续的模式是可以接受的,如下所示:

DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.S X"); // notice the space
// "2016-5-25T22:0:10.6 Z" input is acceptable
// "2016-05-25T22:00:10.6 Z" input is acceptable
// "2016-05-25T22:00:10.678 Z" input is acceptable

解决方法是,如果您的输入具有连续的毫秒和时区(之间没有空格),请创建多个 DateFormat并捕获异常。

DateFormat df1 = new SimpleDateFormat("y-M-d'T'H:m:s.SX");
DateFormat df2 = new SimpleDateFormat("y-M-d'T'H:m:s.SSX");
DateFormat df3 = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX");
try {
    result = df1.parse(inputDate); // first attempt
} catch (ParseException e1) {
    try {
        result = df2.parse(inputDate); // second attempt
    } catch (ParseException e2) {
        result = df3.parse(inputDate); // last attempt, dead if fails
    }
}

是的,这个解决方法是一种污垢:D。

关于Java 无法解析的日期 : different number of characters in ms value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449216/

相关文章:

java - 找不到配置文件 JAVA EE

java - 编译Java代码时未报告异常java.io.IOException

java - 与日志库冲突 - 类路径包含多个 SLF4J 绑定(bind)

java - 获取 SQLite 单列结果列表的快速方法

将返回操作系统的短日期格式的 Windows 命令

用于检查日期的 PHP 正则表达式为 YYYY-MM-DD 格式

java - 具有水平线性布局的 Android 水平 ScrollView 。如何填充整个宽度?

angularjs - 如何在AngularJS中格式化日期

javascript - 使用 JavaScript 将秒转换为 HH-MM-SS?

java 。无法使用 DateFormat 解析日期