我们必须进行一些安全检查,我们从代码的某些部分获取一些日期,然后我们计算天数的差异
String userDate = EncryptUtil.getInstance().decrypt(Constants.USER_DATE);
String currentDate = new SimpleDateFormat("dd/MM/yyyy").format(calendar.getTime());
long startTime = new Date(userDate).getTime();
long presentTime = new Date(currentDate).getTime();
long diffTime = presentTime - startTime;
long diffDays = diffTime / (1000 * 60 * 60 * 24);
userDate
值即将03/06/2017
而currentDate
为07/06/2017
,两者都是正确的,但是当我计算天差时(diffDays
)它给出 122 的差异,其实际应该是 4 。我不明白为什么?任何人都可以提供帮助。
答案 0 :(得分:4)
Date
API。public static void main(String args[]) throws Exception {
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate userDate = LocalDate.parse("03/06/2017", formatter);
LocalDate currentDate = LocalDate.parse("07/06/2017", formatter);
long days = ChronoUnit.DAYS.between(userDate, currentDate);
System.out.printf("%s days have passed%n", days);
}
您的实际问题是,您假设Date
解析ddMMyyyy
这是不正确的,这是欧洲日期格式,而不是美国日期格式。
来自JavaDoc for Date.parse
(由不推荐使用(!!)String
构造函数使用):
如果数字后跟斜线,则将其视为一个月(减少1以产生0到11范围内的数字),除非已经识别了一个月,在这种情况下它被视为作为一个月的一天。
即。它试图先解析一个月,然后解析一天。
答案 1 :(得分:1)
您的日期似乎不是以ddMMyyyy解析,而是以MMddyyyy格式解析。这就是为什么天数差异给你4个月而不是4天。
您可以停止使用不推荐使用的API(自Java 1.1以来不推荐使用新的日期(字符串))并开始使用新的Java时间类https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
答案 2 :(得分:1)
不要依赖带有字符串的java.util.Date
构造函数。它已被弃用,因此您无论如何都不应该使用它。使用SimpleDateFormat
解析字符串:
DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
long startTime = fmt.parse(userDate).getTime();
此外,您使用currentDate
执行的操作是一种不必要的复杂和迂回方式,可以从calendar
以毫秒为单位获取时间戳。你可以这样做:
long presentTime = calendar.getTime().getTime();
无需变量currentDate
。
最好是使用Java 8日期和时间API(包java.time
)而不是旧的java.util.Date
和java.util.Calendar
类。