Java 解析datetime字符串在索引21上出现错误

Java 解析datetime字符串在索引21上出现错误,java,datetime,Java,Datetime,我有一个日期字符串: 2011-11-01T13:00:00.000 不管怎样,我似乎都无法解析这个 如果我尝试SimpleDateformat或 我最后一次尝试是: LocalDateTime datetime = LocalDateTime.parse( deliverydate, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.S")); 但这给了我一个关于索引21的错误。因为我实际上只关心日期而不关心时间,所以我是否只需要

我有一个日期字符串:

2011-11-01T13:00:00.000
不管怎样,我似乎都无法解析这个 如果我尝试
SimpleDateformat

我最后一次尝试是:

LocalDateTime datetime = LocalDateTime.parse(
  deliverydate,
  DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.S"));
但这给了我一个关于索引21的错误。因为我实际上只关心日期而不关心时间,所以我是否只需要将该日期字符串作为子字符串?

您指定了一位数的亚秒精度,但您有三位数。使用
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);
您指定了一位数的亚秒精度,但您有三位数。使用
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);
Java7/8是兼容的

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

您可以在javadoc的“示例”部分找到更多示例。

Java7/8是兼容的

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


您可以在javadoc的“示例”部分找到更多示例。

您使用过哪一版本的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 在评论之后,我已经在没有joda time的情况下(在纯Java8中)测试了上述问题,并且工作得非常好

代码:

示例断点:


您使用过哪种版本的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 在评论之后,我已经在没有joda time的情况下(在纯Java8中)测试了上述问题,并且工作得非常好

代码:

示例断点:



看看这个@elwis,如果你只想要
日期
?尝试在T的周围添加(')。查看下面的链接,我希望它能解决你的问题@A.Wali:T已经被引用了-检查模式。看看这个@elwis,你只需要
Date
?尝试在T周围添加(')。查看下面的链接,我希望它能解决你的问题@A.Wali:The
T
已经被引用了-检查模式。OP使用的是
java.time
API,没有理由倒退到
java.util.*
这里-这只是修复格式模式的问题。不同意,他问了SimpleDateformat或DateTimeformatterTrue,但是考虑到他们可以使用
java.time
,并且他们有问题的代码可以很容易地修复以继续使用它,我认为建议他们回到真正糟糕的
java.util.Date
API不是一个好主意。(此外,您的答案根本无法解释更改——它只是三行代码。仅代码的答案很少有帮助。)Java 7呢?以本机方式,“java.time”仅适用于Java8,不是吗?是的,但OP显然能够使用它,因为他们提供了一个使用它的示例。如果有人不得不使用粗糙的API是一回事,但是当他们不必使用时,我认为提供一个答案让他们回到它上来不是一个好主意。OP使用的是
java.time
API,没有理由在这里倒退回到
java.util.*
,这只是一个修复格式模式的问题。他不同意,他问了SimpleDataFormat或DateTimeformatterTrue,但考虑到他们可以使用
java.time
,并且他们有问题的代码可以很容易地修复以继续使用它,我认为建议他们回到真正糟糕的
java.util.Date
API不是一个好主意。(此外,您的答案根本无法解释更改——它只是三行代码。仅代码的答案很少有帮助。)Java 7呢?以本机方式,“java.time”仅适用于Java8,不是吗?是的,但OP显然能够使用它,因为他们提供了一个使用它的示例。如果有人必须使用粗糙的API是一回事,但是当他们不一定要使用时,我认为提供一个答案让他们回到API上来不是一个好主意。哦,这确实起到了作用,我将其归咎于最近缺少咖啡和太多的.NET。谢谢你哦,这就成功了。当然,我把这归咎于咖啡的缺乏和最近太多的.NET。谢谢,他们没有使用Joda Time-他们使用的是Java 8
Java.Time
API。@JonSkeet-在这种情况下,两者都可以在Java 8中不使用任何格式化程序的情况下工作。;)他们没有使用Joda Time—他们使用的是Java 8
Java.Time
API。@JonSkeet—在这种情况下,两者都在Java 8中没有任何格式化程序的情况下工作。;)