解析日期时间字符串会在索引21上出错

时间:2016-06-21 06:30:04

标签: java datetime

我有这个日期字符串:

2011-11-01T13:00:00.000

我似乎无法解析那个问题 如果我尝试SimpleDateformatDateTimeformatter

我的最后一次尝试就是这个:

LocalDateTime datetime = LocalDateTime.parse(
  deliverydate,
  DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.S"));

但是这在索引21 上给出了错误。我是否只需要对该字符串进行子串,因为我实际上只关心日期而不是时间?

3 个答案:

答案 0 :(得分:4)

你已经指定了亚秒精度的一个数字 - 但你有三个。使用SSS,没关系:

String text = "2011-11-01T13:00:00.000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
LocalDateTime datetime = LocalDateTime.parse(text, formatter);

另请注意,当您从“解析值”中分离出“格式化程序”时,代码的可读性会更高。

SimpleDateFormat不同,DateTimeFormatter是不可变且线程安全的,因此如果您需要多次使用它,我建议将其提取到静态最终字段:

private static final DateTimeFormatter DELIVERY_DATE_FORMATTER =
    DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ROOT);

答案 1 :(得分:2)

Java 7/8符合ISO 8601

Java 7的最佳解决方案(参见Java 8的@Jon帖子)

    DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    String string1 = "2016-06-21T12:08:56.235";
    Date result1 = df1.parse(string1);

您可以在SimpleDateFormat javadoc

中的示例部分找到更多示例

答案 2 :(得分:0)

您使用过哪个版本的Joda-Time?

我已尝试过最新版本 - joda-time:joda-time:2.9.4及以下代码无需任何模式即可运行:

import java.time.LocalDateTime;

public class Main {

    static final String DATE_TIME = "2011-11-01T12:34:56.789";

    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.parse(DATE_TIME);
        System.out.println(dateTime.toString());
    }
}

示例断点:

enter image description here

编辑1

Jon's评论之后,我在没有joda-time的情况下测试了上述问题(在纯Java 8中)并且也运行良好。

代码:

import java.time.LocalDateTime;

public class Main {

    static final String DATE_TIME = "2011-11-01T12:34:56.789";

    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.parse(DATE_TIME);
        System.out.println(dateTime.toString());
    }
}

示例断点:

enter image description here