我正在使用java8格式化程序解析像'2018-04-12 15:12:32.999'
这样的日期。当我有一个3位数毫秒,例如这个日期'2018-04-12 15:12:32.999'
,它工作正常,但它失败并抛出异常java.time.format.DateTimeParseException: Text '2018-04-18 15:27:10.77' could not be parsed at index 20
,当日期只有2位数毫秒时,你能建议如何解析这个日期。
我的格式化程序正在使用“yyyy-MM-dd HH:mm:ss.SSS"
模式。我的代码是这样的:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime.parse(dateStr,formatter);
有几种选择。我会选择这个:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
String dateTimeString = "2018-04-18 15:27:10.77";
LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println(dateTime);
输出:
2018-04-18T15:27:10.770
DateTimeFormatter.ISO_LOCAL_TIME
可选择接受小数点和1到9位数。我更喜欢使用构建器来组合预定义的格式化程序,而不是从头构建我自己的格式化程序
有些人更喜欢较短的一个。就个人而言,我发现它有点hacky:
dateTimeString = dateTimeString.replace(' ', 'T');
LocalDateTime dateTime = LocalDateTime.parse(dateTimeString);
输出是一样的。我们正在利用两个事实:(1)one-arg LocalDateTime.parse
解析ISO 8601格式。 (2)您的输入字符串非常接近ISO 8601格式,它只缺少表示时间部分开始的地方的T
。
您不需要第三个选项,但为了完整起见,我想提一下:如果从头开始构建格式化程序并需要可变数量的小数,请使用DateTimeFormatterBuilder
(我在第一个代码段中使用的类)和its appendFraction
method。它可以控制最小和最大小数位数。
String dateStr = "2018-04-12 15:12:32.99";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.NANO_OF_SECOND, 2, 3, true)
.toFormatter();
System.out.println(LocalDateTime.parse(dateStr, formatter));
其中2,3 - 场的最小宽度
输出:
2018-04-12T15:12:32.990
15:12:32:999
包含结肠:
。你的模式HH:mm:ss.SSS
包含一个点.
这将不匹配。
这有效。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Playground {
public static void main(String[] args) throws ParseException {
String pattern = "yyyy-MM-dd HH:mm:ss.SSS";
String s1 = "2018-04-12 15:12:32.999";
String s2 = "2018-04-18 15:27:10.77";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Date d1 = sdf.parse(s1);
System.out.println(d1);
Date d2 = sdf.parse(s2);
System.out.println(d2);
}
}
输出:
Thu Apr 12 15:12:32 CEST 2018
Wed Apr 18 15:27:10 CEST 2018