Java SimpleDateFormat 将日期移动一年

use*_*596 4 java date type-conversion simpledateformat

我得到了非常奇怪的结果,我无法理解。

public class Test {

  private static DateFormat df = new SimpleDateFormat("dd.MM.YYYY HH:mm");

  public static void main(String[] args) {
    Date d = new Date(1356912000000L);
    System.out.println(d);
    System.out.println(df.format(d));
  }  
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

Mon Dec 31 01:00:00 CET 2012
31.12.2013 01:00
Run Code Online (Sandbox Code Playgroud)

我认为这可能是语言环境的一些问题,但这是整整一年的转变!任何人都可以解释为什么它会以这种方式执行?

Kei*_*ith 9

YYYY是周年,而不是日历年。你想要yyyy。这是Java的相关细节:

一年中的一周和一周年

为 WEEK_OF_YEAR 字段计算的值范围为 1 到 53。日历年的第一周是从该年至少包含 getMinimalDaysInFirstWeek() 天数的 getFirstDayOfWeek() 开始的最早 7 天时间段。因此,它取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 的值和 1 月 1 日的星期几。一年的第 1 周和下一年的第 1 周(不包括)之间的周数从 2 到 52 依次编号或53(朱利安-格里高利过渡涉及的年份除外)。

在构造 GregorianCalendar 时,getFirstDayOfWeek() 和 getMinimalDaysInFirstWeek() 值使用依赖于语言环境的资源进行初始化。当 getFirstDayOfWeek() 为 MONDAY 且 getMinimalDaysInFirstWeek() 为 4 时,周确定与 ISO 8601 标准兼容,这些值用于首选标准的区域设置。这些值可以通过调用 setFirstDayOfWeek() 和 setMinimalDaysInFirstWeek() 显式设置。

一周年与 WEEK_OF_YEAR 周期同步。第一周和最后一周(含)之间的所有周都具有相同的周年值。因此,一周年的第一天和最后一天可能具有不同的日历年值。

例如,1998 年 1 月 1 日是星期四。如果 getFirstDayOfWeek() 为 MONDAY 且 getMinimalDaysInFirstWeek() 为 4(ISO 8601 标准兼容设置),则 1998 年的第 1 周从 1997 年 12 月 29 日开始,到 1998 年 1 月 4 日结束。最后三天的年份为 1998 年1997 日历年。但是,如果 getFirstDayOfWeek() 是 SUNDAY,则 1998 的第 1 周从 1998 年 1 月 4 日开始,到 1998 年 1 月 10 日结束;1998 年的前三天是 1997 年第 53 周的一部分,它们的年份是 1997 年。