解析日期时间,可选毫秒

时间:2017-03-07 14:33:51

标签: java parsing datetime

我正在尝试使用java将给定的字符串解析为DateTime,因为该字符串的格式如下:
    YYYY-MM-DDTHH:MM:SS [.S +】Z
毫秒是可选的,可以是小数点后的任何数字的nubmer。 怎么可以简单地完成?

2 个答案:

答案 0 :(得分:2)

首先,您的格式字符串是错误的。年份和日期应为小写,即<select id='select-course' class='signup__form-text'> <?php foreach ($courses as $course) { ?> <option <?php if ($myCourse == $course->id) { echo 'selected="selected"'; } ?> data-price="<?php echo $course->price ?>"><?php echo $course->post_name ?></option> <?php } ?> </select> yyyydd是文字,因此应引用它,即T

假设“小数点后的任意数字”你实际上是在谈论0到9位数,即纳秒,那么使用“毫秒”< / em>具有误导性。 小数秒将是正确的说法。

要使用Java 8 Time API支持不同数量的小数位数,请使用DateTimeFormatterBuilder,如下所示:

'T'

输出

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
        .appendPattern("uuuu-MM-dd'T'HH:mm:ss")
        .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
        .appendOffset("+HH:mm", "+00:00")
        .toFormatter();
System.out.println(OffsetDateTime.parse("2017-03-07T09:47:15+01:00", fmt));
System.out.println(OffsetDateTime.parse("2017-03-07T09:47:15.123456789-02:00", fmt));
System.out.println(OffsetDateTime.parse("2017-03-07T09:47:15.42000-05:30", fmt));
System.out.println(OffsetDateTime.parse("2017-03-07T09:47:15.2468000-05:30", fmt));

如您所见,当打印OffsetDateTime值时,即使用toString()格式化结果时,尾随零以3个块为增量被截断。

答案 1 :(得分:1)

OffsetDateTime.parse()开箱即用。说我们有:

    String[] input = {
            "2017-03-07T16:06:13+01:00",
            "2017-03-07T16:06:13.1+01:00",
            "2017-03-07T16:06:13.22+01:00",
            "2017-03-07T16:06:13.333+01:00",
            "2017-03-07T16:06:13.4444+01:00",
            "2017-03-07T16:06:13.55555+01:00",
            "2017-03-07T16:06:13.666666+01:00",
            "2017-03-07T16:06:13.7777777+01:00",
            "2017-03-07T16:06:13.88888888+01:00",
            "2017-03-07T16:06:13.999999999+01:00"
    };

    for (String ips : input) {
        OffsetDateTime dt = OffsetDateTime.parse(ips);
        System.out.println(dt);
    }

打印:

2017-03-07T16:06:13+01:00
2017-03-07T16:06:13.100+01:00
2017-03-07T16:06:13.220+01:00
2017-03-07T16:06:13.333+01:00
2017-03-07T16:06:13.444400+01:00
2017-03-07T16:06:13.555550+01:00
2017-03-07T16:06:13.666666+01:00
2017-03-07T16:06:13.777777700+01:00
2017-03-07T16:06:13.888888880+01:00
2017-03-07T16:06:13.999999999+01:00

正如安德烈亚斯在his answer中指出的那样,OffsetDateTime.toString()打印尽可能多的三位小数组,以获得完全准确性。你当然可以自己制作格式,但我认为这不是问题所在。

如果您尝试将其提供10位小数(或更多),则会获得DateTimeParseException