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

Edg*_*ase 14 java

我期待这个打印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)));
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

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

一周文档声明:

从1至53日历年的第一周的WEEK_OF_YEAR领域范围计算值是最早的七天内开始对getFirstDayOfWeek(),它包含从当年至少getMinimalDaysInFirstWeek()天.因而它取决于getMinimalDaysInFirstWeek(),getFirstDayOfWeek()的值,和一月的一周中的一年1周和下一年的1周(不包括)之间1.周一天按顺序编号从2到52或53(Julian-Gregorian过渡所涉及的年份除外).

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

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

所以问题在于,1969年"正常年份"的最后一天实际上是1970年的"一周".

绝对应该使用yyyy以避免混淆 - 周年相对很少有用,并且很容易引起混淆,正如我们所见:)

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


Mat*_*all 19

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

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

这是一年假.

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

  • 这个答案没有解释1970年的输出. (5认同)

Chr*_*ris 10

围捕正确答案约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
Run Code Online (Sandbox Code Playgroud)