【问题标题】:Parse datetime string gives error on index 21解析日期时间字符串在索引 21 上给出错误
【发布时间】:2016-10-22 13:34:11
【问题描述】:

我有这个日期字符串:

2011-11-01T13:00:00.000

不管怎样,我似乎都没有解析到那个 如果我尝试SimpleDateformatDateTimeformatter

我最后一次尝试是这个:

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

但这给了我一个索引 21 上的错误。由于我实际上只关心日期而不关心时间,因此我是否只需要对该日期字符串进行子串化?

【问题讨论】:

标签: java datetime


【解决方案1】:

你用过哪个版本的 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());
    }
}

示例断点:

编辑 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());
    }
}

示例断点:

【讨论】:

  • 他们没有使用 Joda Time - 他们使用的是 Java 8 java.time API。
  • @JonSkeet - 在这种情况下,两者都可以在 Java 8 中没有任何格式化程序的情况下工作。 ;)
【解决方案2】:

Java 7/8 符合 ISO 8601

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

    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);

您可以在SimpleDateFormatjavadoc 的示例部分找到更多示例。

【讨论】:

  • OP 使用的是java.time API,没有理由在这里倒退到java.util.* - 这只是修复格式模式的问题。
  • 不同意,他询问了 SimpleDateformat 或 DateTimeformatter
  • 是的,但考虑到他们可以使用java.time 并且可以很容易地修复有问题的代码以继续使用它,我认为这不是一个好主意建议他们回到真正糟糕的java.util.Date API。 (此外,您的答案根本没有解释更改 - 它只是三行代码。仅代码的答案很少能提供尽可能多的帮助。)
  • Java 7 怎么样?以原生方式,'java.time' 仅适用于 Java 8,不是吗?
  • 是的,但是 OP 显然能够使用它,因为他们提供了一个使用它的示例。如果有人必须使用粗糙的 API 是一回事,但当他们不必这样做时,我认为提供答案让他们回到它不是一个好主意。跨度>
【解决方案3】:

您已指定 一个 亚秒级精度的数字 - 但您已经指定了三个。使用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);

【讨论】:

  • 哦,这当然成功了,我将其归咎于最近缺乏咖啡和过多的 .NET。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多