从日历中获取日期前 18 年

Getting 18 years before date from calender

我需要获取 18 年后的完整日期 (dd/mm/yyyy)。我用代码作为 日历计算 = Calendar.getInstance(); calc.add(Calendar.YEAR, -18);检索年份之前的 18 年而不是月份或日期。我需要在当前日期前 18 年的一天,即使在像任何一个月的 1 号这样的极端情况下也是如此。示例 1-06-2015 是当前日期应该得到 31-05-1997.To 注意我需要 java6

中的代码

我建议使用 Joda Time,因为它会使日期操作和数学运算变得非常容易。例如:

DateTime futureDate = new DateTime();
futureDate.minusYears(18).minusDays(1);
futureDate.toDate(); // return a regular Date object

在Java中,日期值只是从某个固定时间点开始的毫秒数,相关的类没有自己可以更改的格式,这个是 date/time 格式化程序的用途

日历

从你的例子来看,你基本上忽略了这样一个事实,即更改 Calendar 的任何字段都会影响所有其他字段,例如...

Calendar cal = Calendar.getInstance();
cal.set(2015, Calendar.JUNE, 01); // Comment this out for today...
cal.add(Calendar.YEAR, -18);
cal.add(Calendar.DATE, -1);
Date date = cal.getTime();
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(date));

输出

31/05/1997

不过,我建议使用 Java 8 的新时间 API 或 Joda-Time

Java 8 次 API

LocalDate ld = LocalDate.now();
ld = ld.minusYears(18).minusDays(1);
System.out.println(DateTimeFormatter.ofPattern("dd/MM/yyyy").format(ld));

输出

26/06/1997

边缘案例...

LocalDate ld = LocalDate.of(2015, Month.JUNE, 1);
ld = ld.minusYears(18).minusDays(1);
System.out.println(DateTimeFormatter.ofPattern("dd/MM/yyyy").format(ld));

输出

31/05/1997

JodaTime

LocalDate ld = new LocalDate();
ld = ld.minusYears(18).minusDays(1);
System.out.println(DateTimeFormat.forPattern("dd/MM/yyyy").print(ld));

输出

26/06/1997

边缘案例...

LocalDate ld = new LocalDate(2015, DateTimeConstants.JUNE, 1);
ld = ld.minusYears(18).minusDays(1);
System.out.println(DateTimeFormat.forPattern("dd/MM/yyyy").print(ld));

输出

31/05/1997