根据MSDN,System.DateTime.Ticks
“表示自0001年1月1日午夜12:00:00(自1988年1月1日0:00:00起)以来经过的100纳秒间隔的数量阳历)“。
DateTime
,UnixEpoch
中有一个内部字段,其值621355968000000000L
应与Unix Epoch(1970年1月1日午夜)相对应。 (我们可以从new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
获得相同的值。)
我正在尝试根据C#ticks值在Java中创建Date
:
这是一个简单的Java示例来重现问题:
//C# System.DateTime.UnixEpoch = 621355968000000000;
//Java code:
//before Unix Epoch, in milliseconds
Date date = new Date(-621355968000000000L / 10000);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
df.format(date); // 0001-01-03 00:00:00.000 +0000
格里高利历中是否存在一种差距,只有一个平台会考虑这个差距?
答案 0 :(得分:1)
似乎Java Date使用Julian日历表示使用该日历时的日期,而在这种情况下,C#在使用Gregorian Calendar之前使用了Gregorian Calendar。默认情况下,Joda-Time也会及时使用公历。
这似乎有效,但可能有更好的方法。
DateTime dt = new DateTime(-621355968000000000L / 10000);
GregorianCalendar gc = new GregorianCalendar();
gc.set(GregorianCalendar.YEAR, dt.getYear());
gc.set(GregorianCalendar.MONTH, dt.getMonthOfYear() - 1);
gc.set(GregorianCalendar.DAY_OF_MONTH, dt.getDayOfMonth());
gc.set(Calendar.HOUR_OF_DAY, 0);
gc.set(Calendar.MINUTE, 0);
gc.set(Calendar.SECOND, 0);
gc.set(Calendar.MILLISECOND, 0);
Date date = gc.getTime();