用 Calendar 减去天数不会减少年份?

substracting days with Calendar does not decrement year?

为了感谢我的新年快乐,我的 java 代码确实出乎意料:在当前日期 06/01/2022 减去 11 天时它不会减少年份。

有人知道为什么它不 return "2021-12-26" ???

代码:

DateFormat dateFormat = new SimpleDateFormat('YYYY-MM-dd');
Date dt = new Date();
println "current_date : " + dateFormat.format(dt);

Calendar c = Calendar.getInstance();
c.setTime(dt);
c.add(Calendar.DATE, -11);
dt = c.getTime();
println "substracted_date : " + dateFormat.format(dt);

控制台:

current_date : 2022-01-06
substracted_date : 2022-12-26

日期格式 YYYY 是周年格式,而不是 yyyy 年格式。

周年按周更新。例如,2021-12-26 是 2022 年第一周的开始,而不是 2021 年,所以它会显示 2022。但是年份是按日期更新的,所以它会显示 2021。

因此,只需将 YYYY 更改为 yyyy 即可。

DateFormat dateFormat = new SimpleDateFormat('yyyy-MM-dd');

尝试使用来自 Java8

的 LocalDate
import java.time.LocalDate;
public class test {
    public static void main(String[] args) {

        LocalDate date = LocalDate.parse("2022-01-06");
        System.out.println("Date : "+date);

        LocalDate newDate = date.minusDays(11);
        System.out.println("New Date : "+newDate);
    }
}

这将为您提供如下输出 日期:2022-01-06 新日期:2021-12-26

谢谢@Nekomura

为了下次不生气,我带上了带有 2 个断言的腰带和大括号,以免在使用错误模式时感到惊讶 ^^ :

/**
 * renvoie un timestamp Fr de la date du serveur
 * @param pattern (du type "dd-MM-yyyy" ou "HH:mm:ss")
 * @param day_to_add permet d'ajout/retrancher des jours à la date actuelle
 * @param hour_to_add permet d'ajout/retrancher des heures à la date actuelle
 * @return le timetstamp au format correspondant à @pattern
 */
@Keyword
public static String getServerTimestamp(String pattern, int day_to_add, int hour_to_add) {

    assert !pattern.contains("Y") : "ne pas utiliser pattern 'Y' mais 'y' (sinon on prend week year et ça marche pas bien) ; voir reference https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html"
    assert !pattern.contains("D") : "ne pas utiliser pattern 'D' mais 'd' (sinon on prend day in year et ça marche pas bien) ; voir reference https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html"
    
    Date dt = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(dt);
    if (day_to_add != null) {
        c.add(Calendar.DATE, day_to_add);
    }
    if (hour_to_add != null) {
        c.add(Calendar.HOUR, hour_to_add);
    }
    dt = c.getTime();
    DateFormat dateFormat = new SimpleDateFormat(pattern);
    return dateFormat.format(dt);
}