用 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);
}
为了感谢我的新年快乐,我的 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
的 LocalDateimport 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);
}