在Java的SimpleDateFormat类中格式化日期时,YYYY和yyyy之间存在细微的差异。它们都代表一年,但是yyyy代表日历年,而YYYY代表星期。这是一个细微的差异,仅会导致一年左右的变更问题,因此您的代码本可以一直正常运行,而仅在新的一年中引发问题。
一个例子比用文字更好地说明了这一点。
package com.dangoldin.test;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) {
try {
String[] dates = {"2018-12-01", "2018-12-31", "2019-01-01"};
for (String date: dates) {
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
Date d = dt.parse(date);
SimpleDateFormat dtYYYY = new SimpleDateFormat("YYYY");
SimpleDateFormat dtyyyy = new SimpleDateFormat("yyyy");
System.out.println("For date " + date + " the YYYY year is " + dtYYYY.format(d) + " while for yyyy it's " + dtyyyy.format(d));
}
} catch (Exception e) {
System.out.println("Failed with exception: " + e);
}
}
}
这为您提供以下内容:
For date 2018-12-01 the YYYY year is 2018 while for yyyy it's 2018
For date 2018-12-31 the YYYY year is 2019 while for yyyy it's 2018
For date 2019-01-01 the YYYY year is 2019 while for yyyy it's 2019
自两年格式匹配以来,第一个和最后一个有意义。中间一个是奇数之一。日期开始于2018-12-31,但是YYYY给您2019,而yyyy给您2018。通常,您几乎应该始终使用yyyy,因此,添加某种形式的lint或检查以确保您的代码没有引用YYYY的任何日期格式。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class Example {
public static void main(String[] args) {
LocalDateTime currentDateTime = LocalDateTime.now();
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy");
String formatDateTime = currentDateTime.format(format1);
System.out.println(formatDateTime);
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("YYYY");
String formatDateTime2 = currentDateTime.format(format2);
System.out.println(formatDateTime2);
Date date = new Date();
SimpleDateFormat simpleformat1 = new SimpleDateFormat("yyyy");
String formatDateTime3 = simpleformat1.format(date);
System.out.println(formatDateTime3);
SimpleDateFormat simpleformat2 = new SimpleDateFormat("YYYY");
String formatDateTime4 = simpleformat2.format(date);
System.out.println(formatDateTime4);
}
}
12月31日执行结果:
2020
2021
2020
2021