解析时日期会发生变化

时间:2017-01-23 10:17:33

标签: java date

在以下代码中,解析时日期会发生变化: 特别是会议纪要增加了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);

2 个答案:

答案 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());