有梦就去追 有梦就去追

记录精彩的程序人生

目录
Java中公历和ISO 8601周历的一个坑
/    

Java中公历和ISO 8601周历的一个坑

如果尝试运行下面的代码,其结果可能会让你意外:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateTest {
 public static void main(String[] args) {
  Calendar calendar = Calendar.getInstance();
  calendar.set(2014, Calendar.DECEMBER, 29);
  Date date = calendar.getTime();
  SimpleDateFormat formaty = new SimpleDateFormat ("yyyy-MM-dd");
  SimpleDateFormat formatY = new SimpleDateFormat ("YYYY-MM-dd");
  System.out.println(formaty.format(date));
  System.out.println(formatY.format(date));
 }
}

运行结果为:

2014-12-29

2015-12-29

        怎么样,看出区别了没?在Java中对日期进行格式化的时候,对格式化时采用的符号大小写往往不是很在意,因而很容易跳进这样的“坑”中。其根本原因,就在于YYYY和yyyy在Java中表示年份的时候,是两套日期体系的东西。YYYY是ISO 8601里的年份,而yyyy是格里高利历(即公历)里的年份。关于ISO 8601,WIKI也有说明,详见:http://zh.wikipedia.org/wiki/ISO_8601。

        ISO 8601标准中采用周历来表示日期,在周历的一年中,有364天,或者371天。它规定,公历一年中第一个周四所在的那个星期,作为一年的第一个星期。这导致了一个很有意思的结果,在公历每年元旦前后的几天,年份会和ISO 8601纪年法差一年。这也解释了上面代码中的“意外”。例如2014-12-29日,用ISO 8601表示的周历就是2015-01-星期一。

        另外:周历在在Java中的格式为:YYYY-ww-EE。PS:关于日期格式化模式请见D的博文:Java日期格式模式



标题:Java中公历和ISO 8601周历的一个坑
作者:flhuoshan
地址:http://ymjqz.com/articles/2021/01/03/1423812511237.html