我有一个以毫秒为单位的日期-6847824600000。这是猪中使用的输入数据,并使用ToDate()函数进行转换,该函数在内部使用Joda日期时间来计算日期。
输出格式类似于小时minitue - 00:23:28。(实际) 但是在Java Date中,它给出了00:00:00,即(预期)输出。
当地时区是亚洲/加尔各答。我也尝试过使用Etc / GMT + 0时区。 它没有给出与java日期相同的结果。 我从未使用过Joda约会时间。 请帮助如何获得Java日期的类似输出。
答案 0 :(得分:1)
你偶然发现了一个有趣的奇怪之处。
似乎当一个时区应用于1752年的这个日期时间时,offset-from-UTC在java.time或Joda-Time下被神秘地改变了7分2秒。
我们看到
而不是-08:00
。-07:52:58
的偏移
旧的java.util.Date类没有显示出这样的惊喜。
我没有解决方案或解释。但我可以证明这个谜。
America/Los_Angeles
首先,我们尝试自己的默认时区America/Los_Angeles
。
// java.util.Date class.
java.util.Date date = new java.util.Date ( input );
// 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