有48小时的差异,将C#Ticks转换为Java时间戳

时间:2015-06-24 15:57:19

标签: java c# datetime calendar gregorian-calendar

根据MSDN,System.DateTime.Ticks“表示自0001年1月1日午夜12:00:00(自1988年1月1日0:00:00起)以来经过的100纳秒间隔的数量阳历)“。

DateTimeUnixEpoch中有一个内部字段,其值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

格里高利历中是否存在一种差距,只有一个平台会考虑这个差距?

1 个答案:

答案 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();