我正在尝试使用java将给定的字符串解析为DateTime,因为该字符串的格式如下:
YYYY-MM-DDTHH:MM:SS [.S +】Z
毫秒是可选的,可以是小数点后的任何数字的nubmer。
怎么可以简单地完成?
答案 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>
和yyyy
,dd
是文字,因此应引用它,即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
。