如果尝试运行下面的代码,其结果可能会让你意外:
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日期格式模式。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于