具有+符号的日期格式问题

时间:2016-08-30 11:08:53

标签: java datetime

我有约会2016-03-30T23:59:59.000000+0000。我可以知道它的格式。 因为如果我使用yyyy-MM-dd'T'HH:mm:ss.SSS,则会抛出异常

2 个答案:

答案 0 :(得分:2)

SimpleDateFormat为您提供答案:

yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ

答案 1 :(得分:2)

如果你真的有微秒不同于零那么我强烈建议不要使用SimpleDateFormat而是使用Java-8-Time-API或其他可以处理微秒的时间库。而且这并不是旧API被证明非常有限的唯一情况。

SimpleDateFormat的否定示例(破碎,毫秒消失!!!):

String input = "2016-03-30T23:59:59.123456+0530";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(sdf.parse(input))); // 2016-03-30T18:32:02.000456+0000

Java-8-example(有效):

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ");
OffsetDateTime odt = OffsetDateTime.parse(input, dtf);
System.out.println(odt); // 2016-03-30T23:59:59.123456+05:30

如果你从来没有微秒但只有几毫秒而且想坚持使用旧的API那么你可能会尝试跟随黑客攻击:

    String input = "2016-03-30T23:59:59.123000+0530";

    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'xxx'Z");
    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    sdf2.setTimeZone(TimeZone.getTimeZone("GMT"));
    System.out.println(sdf2.format(sdf1.parse(input.replace("000", "xxx")))); 

2016-03-30T18:29:59.123 + 0000

然而,这个"解决方案" 2000年中断(您可以通过进一步的字符串预处理找到更好的一个),并最终可用的微秒丢失。所以在这里使用SimpleDateFormat是一个坏主意。