为什么新的日期(0L)不会返回零日期

时间:2011-06-22 16:32:42

标签: java datetime

Date date = new Date(0L);

它不应该给我一个零日期吗?像00/00/0000?给我 Wed Dec 31 19:00:00 EST 1969

6 个答案:

答案 0 :(得分:26)

根据javadocsDate上的此构造函数使用与基线时间的偏移量:

  

分配Date对象和   初始化它来代表   指定的毫秒数   标准基准时间称为“   时代“,即1970年1月1日,   00:00:00 GMT。

据推测,你是在EST,因此结果。

顺便说一句,我不希望你注意到的结果是由任何可以想象的Date操纵产生的,因为那甚至不是一个有效的日期(月和日= 0)。

答案 1 :(得分:5)

来自Java API:

  

日期(长日期):分配一个Date对象并对其进行初始化,以表示自标准基准时间(" epoch",即1970年1月1日00:00)以来指定的毫秒数: 00 GMT。

请参阅:http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html

答案 2 :(得分:1)

自纪元以来的时间是毫秒。

这个时代是格林威治标准时间1970年1月1日。

答案 3 :(得分:1)

因为该构造函数创建对象所以将其初始化为表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT。

答案 4 :(得分:0)

Java日期和日期的大多数计算机实现都以毫秒为单位存储,从所谓的纪元开始。那是1970年1月1日.Java日期表示为自纪元以来的毫秒数。因为纪元是时代本身,所以0毫秒。这就是你获得这个价值的原因。

答案 5 :(得分:0)

TL;博士

1970年的第一个UTC时刻:

Instant.EPOCH.toString()
  

1970-01-01T00:00:00Z

与纽约地区相同的那一刻:

Instant.EPOCH.atZone( ZoneId.of( "America/New_York" ) ).toString()
  

1969-12-31T19:00-05:00 [美国/纽约]

详细

其他答案是正确的:纪元参考是UTC的1970年的第一个时刻,而你的时区是后面 UTC的5个小时。这是更新的信息。

java.time

现代方法使用 java.time 类来取代麻烦的旧遗留日期时间类。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

1970-01-01T00:00:00Z的纪元参考被定义为常数Instant.EPOCH

Instant.EPOCH.toString()
  

1970-01-01T00:00:00Z

要在另一个时区看到同一时刻,请应用ZoneId获取ZonedDateTime。您可以将其视为:“ZonedDateTime = Instant + ZoneId”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/New_York" ) ;  
ZonedDateTime zdt = Instant.EPOCH.atZone( z ) ;
  

zdt.toString():1969-12-31T19:00-05:00 [America / New_York]

结果是在前一年的最后一天提前五个小时的时间。这个ZonedDateTime表示相同的时刻,即时间轴上的同一点,但是不同的挂钟时间。

在印度的同一时刻,提前的时间是,而不是之后。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = Instant.EPOCH.atZone( z ) ;

    System.out.println(zdt );
  

zdt.toString():1970-01-01T05:30 + 05:30 [亚洲/加尔各答]

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore