【问题标题】:Java SimpleDateFormat shifts Date by one year [duplicate]Java SimpleDateFormat 将日期移动一年 [重复]
【发布时间】:2015-12-27 03:07:38
【问题描述】:
我得到了非常奇怪的结果,我无法理解。
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));
}
}
给出输出:
Mon Dec 31 01:00:00 CET 2012
31.12.2013 01:00
我认为这可能是语言环境的一些问题,但这是一整年的转变!谁能解释一下为什么会这样?
【问题讨论】:
标签:
java
date
simpledateformat
type-conversion
【解决方案1】:
代替:
"dd.MM.YYYY HH:mm"
用途:
"dd.MM.yyyy HH:mm"
【解决方案2】:
YYYY 是周年,而不是日历年。你想要yyyy。以下是 Java 的相关细节:
为 WEEK_OF_YEAR 字段计算的值范围为 1 到 53。
日历年的第一周是最早的 7 天期间
从 getFirstDayOfWeek() 开始,至少包含
getMinimalDaysInFirstWeek() 从那年开始的天数。因此它取决于
getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 和
1 月 1 日的星期几。一年的第 1 周和
次年的第 1 周(不含)按顺序编号
从 2 到 52 或 53(除了参与的年份)
儒略-格里高利过渡)。
getFirstDayOfWeek() 和 getMinimalDaysInFirstWeek() 值是
构造时使用依赖于语言环境的资源进行初始化
阳历日历。星期确定与 ISO 兼容
8601 标准当 getFirstDayOfWeek() 是 MONDAY 并且
getMinimalDaysInFirstWeek() 为 4,这些值在语言环境中使用
首选标准的地方。这些值可以通过以下方式显式设置
调用 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() 是
星期日,然后 1998 年的第 1 周开始于 1998 年 1 月 4 日,结束于
1998 年 1 月 10 日; 1998 年的前三天是一周的一部分
1997 年的 53 个,他们的周年是 1997 年。