java日期和joda日期时间的差异

c90pui9n  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(456)

我有一个毫秒级的日期-6847824600000。这是pig中使用的输入数据,通过使用todate()函数进行转换,该函数内部使用joda date time来计算日期。
输出格式类似于hour minitue second-00:23:28(实际),但在java date中,它给出的是00:00:00(预期的)输出。
当地时区是亚洲/加尔各答。我也尝试过etc/gmt+0时区。它给出的结果与javadate不同。我从来没用过乔达的约会时间。请帮助如何获得java date的类似输出。

eqfvzcg8

eqfvzcg81#

你偶然发现了一个有趣的怪事。
似乎当时区应用于1752年的这个日期时间时,在java.time或joda time下,utc的偏移量神秘地改变了7分2秒。
而不是偏移 -08:00 我们看到了 -07:52:58 .
旧的java.util.date类没有显示出这样的惊讶。
我没有解决办法或解释。但我可以证明这个秘密。

美国/洛杉矶时区

首先我们试试我自己的默认时区 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 作为时区。

TimeZone.setDefault ( TimeZone.getTimeZone ( "Asia/Kolkata" ) );
``` `Asia/Kolkata` 是印度的现代时区,通常是utc的偏移量 `+05:30` (比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

相关问题