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

    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日期格式模式


    本文为风林火山博客原创,转载请注明出处:www.flcoder.com