从日历中获取 18 年前的日期

MUH*_*EER 1 java datetime datepicker

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

Mad*_*mer 5

在 Java 中,日期值只是某个固定时间点的毫秒数,相关类不携带自己可以更改的格式,这就是日期/时间格式化程序的用途

日历

从您的示例中,您基本上忽略了这样一个事实,即更改Calendar's 的任何字段都会影响所有其他字段,例如...

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));
Run Code Online (Sandbox Code Playgroud)

哪些输出

31/05/1997
Run Code Online (Sandbox Code Playgroud)

但是,我建议使用 Java 8 的新 Time 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));
Run Code Online (Sandbox Code Playgroud)

哪些输出

26/06/1997
Run Code Online (Sandbox Code Playgroud)

边缘情况...

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

哪些输出

31/05/1997
Run Code Online (Sandbox Code Playgroud)

乔达时间

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

哪些输出

26/06/1997
Run Code Online (Sandbox Code Playgroud)

边缘情况...

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

哪些输出

31/05/1997
Run Code Online (Sandbox Code Playgroud)