在以下代码中,解析时日期会发生变化: 特别是会议纪要增加了5分钟。 为什么会这样?
String inputDate="2016-12-01T16:30:59.264448";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSSSSS");
SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
java.util.Date parsedTimeStamp=null;
if(!inputDate.contains(".")){
try {
parsedTimeStamp = dateFormat1.parse(inputDate.replace("T", " "));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
parsedTimeStamp = dateFormat.parse(inputDate.replace("T", " "));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Date-->"+parsedTimeStamp);
答案 0 :(得分:2)
2件事,如果你看一下SimpleDateFormat(Java 8或7)的文档,特别是关于“日期和时间模式”的部分,你会注意到
H小时(0-23)
h上午/下午(1-12)小时
所以你应该考虑使用下面的
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
并且您提供的毫秒数将转换为秒/分钟,从而得到结果。
答案 1 :(得分:1)
如果您强烈要求在输入中保留微秒精度,那么您可能会考虑Java-8中引入的新类java.time.LocalDateTime
,它可以存储最多纳秒。并且您的输入不包含任何区域或偏移信息,因此LocalDateTime
是类型的最佳选择。仅使用一个格式化程序的示例:
String input1 = "2016-12-01T16:30:59.264448";
String input2 = "2016-12-01T16:30:59";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss[.SSSSSS]");
LocalDateTime ldt1 = LocalDateTime.parse(input1, dtf); // 2016-12-01T16:30:59.264448
LocalDateTime ldt2 = LocalDateTime.parse(input2, dtf); // 2016-12-01T16:30:59
您还可以使用以下桥接到旧Date
- 类型(legacy-API):
java.util.Date d = java.util.Date.from(ldt1.atZone(ZoneId.systemDefault()).toInstant());