Java日期和Joda日期时间的差异

时间:2016-03-26 21:32:23

标签: java apache-pig jodatime

我有一个以毫秒为单位的日期-6847824600000。这是猪中使用的输入数据,并使用ToDate()函数进行转换,该函数在内部使用Joda日期时间来计算日期。

输出格式类似于小时minitue - 00:23:28。(实际) 但是在Java Date中,它给出了00:00:00,即(预期)输出。

当地时区是亚洲/加尔各答。我也尝试过使用Etc / GMT + 0时区。 它没有给出与java日期相同的结果。 我从未使用过Joda约会时间。 请帮助如何获得Java日期的类似输出。

1 个答案:

答案 0 :(得分:1)

你偶然发现了一个有趣的奇怪之处。

似乎当一个时区应用于1752年的这个日期时间时,offset-from-UTCjava.timeJoda-Time下被神秘地改变了7分2秒。

  

我们看到-08:00

而不是-07:52:58的偏移

旧的java.util.Date类没有显示出这样的惊喜。

我没有解决方案或解释。但我可以证明这个谜。

时区America/Los_Angeles

首先,我们尝试自己的默认时区America/Los_Angeles

java.util.Date

// java.util.Date class.
java.util.Date date = new java.util.Date ( input );

java.time

// java.time framework (built into Java 8 and later).
Instant instant = Instant.ofEpochMilli ( input );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , ZoneId.systemDefault () );

约达时间

// Joda-Time library, version 2.9.2.
org.joda.time.Instant jodaInstant = new org.joda.time.Instant ( input );
DateTime dateTime = new DateTime ( input );

转储到控制台。

    System.out.println ( "---|  java.util.Date  |-------" );
    System.out.println ( "JVM’s current default time zone: " + TimeZone.getDefault () );
    System.out.println ( "date: " + date );

    System.out.println ( "---|  java.time  |-------" );
    System.out.println ( "Current ZoneId: " + ZoneId.systemDefault () );
    System.out.println ( "instant: " + instant + " | zdt: " + zdt );

    System.out.println ( "---|  Joda-Time  |-------" );
    System.out.println ( "Current DateTimeZone: " + DateTimeZone.getDefault () );
    System.out.println ( "jodaInstant: " + jodaInstant + " | dateTime: " + dateTime );

跑步时。

---|  java.util.Date  |-------
JVM’s current default time zone: sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
date: Sun Dec 31 10:30:00 PST 1752
---|  java.time  |-------
Current ZoneId: America/Los_Angeles
instant: 1752-12-31T18:30:00Z | zdt: 1752-12-31T10:37:02-07:52:58[America/Los_Angeles]
---|  Joda-Time  |-------
Current DateTimeZone: America/Los_Angeles
jodaInstant: 1752-12-31T18:30:00.000Z | dateTime: 1752-12-31T10:37:02.000-07:52:58

时区Asia/Kolkata

现在我们在顶部添加此单行,以指定Asia/Kolkata作为时区。

TimeZone.setDefault ( TimeZone.getTimeZone ( "Asia/Kolkata" ) );

Asia/Kolkata是现代time zone of India,通常是+05:30的UTC偏移(比UTC早5个半小时)。然而在这个例子中,我们看到偏移量在java.time和Joda-Time中同样受到几分钟和几秒钟的影响。与此同时,旧的java.util.Date显示了次年1753年的第一个时刻。

跑步时。

---|  java.util.Date  |-------
JVM’s current default time zone: sun.util.calendar.ZoneInfo[id="Asia/Kolkata",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
date: Mon Jan 01 00:00:00 IST 1753
---|  java.time  |-------
Current ZoneId: Asia/Kolkata
instant: 1752-12-31T18:30:00Z | zdt: 1753-01-01T00:23:28+05:53:28[Asia/Kolkata]
---|  Joda-Time  |-------
Current DateTimeZone: Asia/Kolkata
jodaInstant: 1752-12-31T18:30:00.000Z | dateTime: 1753-01-01T00:23:28.000+05:53:28