Java Date(0)不是1970年1月1日

我期待这个打印1970-01-01-00:00:00 ,但它打印1970-12-31-19:00:00

我怎么误解了Date的计算方式? 这是一年假。 我在Windows 7上用JDK 1.6运行它

System.out.println(new SimpleDateFormat("YYYY-MM-dd-HH:mm:ss").format(new Date(0))); 

它不仅仅是时区 – 它是使用时区使用YYYY的混合,它表示周年而不是 (从Java 7开始)。 将它改为yyyy ,你会看到1969年。

一周的文档声明:

为WEEK_OF_YEAR字段计算的值范围为1到53.日历年的第一周是从getFirstDayOfWeek()开始的最早的七天时段,该时间段至少包含该年的getMinimalDaysInFirstWeek()天。 因此,它取决于getMinimalDaysInFirstWeek(),getFirstDayOfWeek()和1月1日的星期几的值。一年的第1周和第二年的第1周之间的周(不包括)从2到52顺序编号或53(Julian-Gregorian过渡期间的年份除外)。

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

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

所以问题是1969年“正常年份”的最后一天实际上是1970年的“一周”。

绝对应该使用yyyy以避免混淆 – 周年相对很少有用,很容易造成混乱,正如我们所见:)

编辑:正如评论中所述,你确定你没有使用Java 7吗? 1.6中SimpleDateFormat的文档没有提到它……也许你在1.6中编译但在7中运行

我怎么误解了Date的计算方式?

new Date(0)UTC的 1970年1月1日 您的时区不是UTC。

这是一年假。

不,这不对。 打印价值仅落后5个小时。 让我猜一下 – 你在美国东部的哪个地方?

要汇总关于YYYYyyyy以及时区处理的正确答案,以下是产生预期输出的代码:

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println(sdf.format(new Date(0))); //1970-01-01-00:00:00 

做* 1000L

  System.out.println(new SimpleDateFormat("YYYY-MM-dd-HH:mm:ss").format(new Date(0) * 1000L));