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

Java日期(0)不是1970年1月1日,java,Java,我原以为这会打印出1970-01-01-00:00:00,但它会打印出1970-12-31-19:00:00 我对日期是如何计算的误解是什么?还有一年。我用JDK1.6在Windows7上运行这个 System.out.println(new SimpleDateFormat("YYYY-MM-dd-HH:mm:ss").format(new Date(0))); 我对日期是如何计算的误解是什么 新日期(0)是1970年1月1日。您的时区不是UTC 还有一年 不,不是。打印值仅落后5小时。让我

我原以为这会打印出1970-01-01-00:00:00,但它会打印出1970-12-31-19:00:00

我对日期是如何计算的误解是什么?还有一年。我用JDK1.6在Windows7上运行这个

System.out.println(new SimpleDateFormat("YYYY-MM-dd-HH:mm:ss").format(new Date(0)));
我对日期是如何计算的误解是什么

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

还有一年


不,不是。打印值仅落后5小时。让我猜猜——你在什么地方?

这可能与你的时区有关。
不仅仅是时区-它是使用时区和使用
yyy
的混合体,后者表示周年而不是年(从Java 7开始)。将其更改为
yyyy
,您将看到1969

国家:

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

在构造GregoriaCalendar时,getFirstDayOfWeek()和getMinimalDaysInFirstWeek()值是使用依赖于区域设置的资源初始化的。当getFirstDayOfWeek()为星期一且getMinimalDaysInFirstWeek()为4时,周确定与ISO 8601标准兼容,这些值在首选标准的地区使用。可以通过调用setFirstDayOfWeek()和setMinimalDaysInFirstWeek()显式设置这些值

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

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

您应该明确使用
yyyy
来避免混淆-周年相对来说很少有用,而且很容易引起混淆,正如我们所看到的:)


编辑:如评论中所述,您确定您没有使用Java7吗?别提了。。。也许您是在1.6中编译,但在7中运行?

为了总结有关
YYYY
YYYY
以及时区处理的正确答案,下面是生成您期望的输出的代码:

    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
只需做1000升

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

那行代码没有运行。
YYYY
无效。顺便问一下,你确定这不是1969年而不是1970年,因为你在UTC-5?@BalusC:YYYY不是无效的-有充分的文件证明这是周-年…@Jon:在这个特殊的构造中,它是无效的。另外,OP说要使用Java1.6,而不是1.7。@BalusC:Ooh-我没有意识到它不是在Java1.6中。虽然代码在1.7中确实有效…@Jon:all with all,这只是一个糟糕且令人困惑的问题:)好吧,如果我们假设你是对的,并且OP实际上是在Java 1.7上运行的,那么你可能想改进你在这方面的答案。我估计1900年是由于EDT,但它即将过渡到1971年,所以它几乎提前了365天,在我看来,乔恩,你是对的(当然:)。我从没听说过“一周一年”