2016-11-20 110 views
-2

我的代码:不正确解析的日期

DateFormat format = new SimpleDateFormat("dd/MM/YYYY"); 

Date Today = format.parse(today); 
Date Date = format.parse(date); 

difference = (Date.getTime() - Today.getTime())/86400000; 
Math.abs(difference); 
System.out.println(String.valueOf("date" + date)); 
System.out.println(String.valueOf("date" + Date)); 
System.out.println(String.valueOf("date" + today)); 
System.out.println(String.valueOf("date" + Today)); 

输出:
date29 /二千零十六分之十一
dateSun年12月27日00:00:00 GMT + 08:00 2015
date20/11/2016
dateSun Dec 27 00:00:00 GMT + 08:00 2015

我在解析时遇到问题日期,原始日期是29/11/2016,但是经过分析后,日期变为Sun Dec 27 00:00:00 GMT + 08:00 2015

此问题出现在我的整个程序中,它与日期有关。

enter image description here

+2

不显示您的代码的屏幕截图。将源代码粘贴到代码块中的问题中。 – Andreas

+0

@Andreas完成.. –

+0

无关,但是这个'Math.abs(区别);'是NoOp。 – Henry

回答

1

格式DD/MM/YYYY应DD/MM/YYYY。请参阅SimpleDateFormat的javadoc:y = Year,Y = Week year。 - Andreas 12分钟前

谢谢解决。

1

我知道你已经从Andreas’ comment得到了你的解决方案。我想在这里做的是退后一步,并建议对代码进行一些改进。随意忽略。

  1. 最重要的,我建议你扔早已过时的类DateDateFormatSimpleDateFormat落水,并开始使用其现代的替代品。这些出现在2014年初的java.time包中。这些还提供了一种更简单明了的计算差异的方法。
  2. 按照约定,变量名称以小写字母开头。具体来说,在同一个源文件中使用一个名为Date的类和名为dateDate的两个变量势必造成混淆。
  3. 像亨利我也认为你打算difference = Math.abs(difference);
  4. 您对String.valueOf()的调用是多余的,只是让代码更难阅读。放下它们。

为了举例,我在下面的代码中建议,我故意使用不正确的日期格式模式字符串dd/MM/YYYY

DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/YYYY"); 

    LocalDate todayAsLocalDate = LocalDate.parse(today, format); 
    LocalDate dateAsLocalDate = LocalDate.parse(date, format); 

    difference = ChronoUnit.DAYS.between(todayAsLocalDate, dateAsLocalDate); 
    difference = Math.abs(difference); 
    System.out.println("date " + date); 
    System.out.println("date " + dateAsLocalDate); 
    System.out.println("date " + today); 
    System.out.println("date " + todayAsLocalDate); 
    System.out.println(difference); 

由于代码现在,它会抛出java.time.format.DateTimeParseException: Text '20/11/2016' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2016, MonthOfYear=11, DayOfMonth=20},ISO of type java.time.format.Parsed。当代码不正确时,我更喜欢对可能未被注意的不正确结果的异常。所以这比SimpleDateFormat给你更好。

尽管消息不容易阅读,但要注意的一点是WeekBasedYear。以周为基础的年份只对周数有用,你不打算这么做。如果与the documentation进行比较,您会发现模式中的大写字母Y是以周为基准的年份,而小写字母y是年份。因此,让我们纠正:

DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 

现在代码打印:

date 29/11/2016 
date 2016-11-29 
date 20/11/2016 
date 2016-11-20 
9 

我们注意到现代类的最后一个好处:你可以有一个日期没有时间的日时,这就是你需要再次提供更精确地模拟您的需求的代码,从而留下更少的混淆空间。

问题:我可以在我的Java版本中使用现代类吗?

如果至少使用Java ,您可以。