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

本文关键字:转换 C#Ticks Java 时间戳 48小时 | 更新日期: 2023-09-27 17:59:43

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

DateTimeUnixEpoch中有一个内部字段,其值为621355968000000000L,应与Unix Epoch(1970年1月1日午夜UTC)相对应。(我们可以从new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);中得到相同的值。)

我正试图在Java中创建一个基于C#ticks值的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

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

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

Java Date似乎使用儒略历来表示使用该日历的日期,而C#在本例中使用的是公历。默认情况下,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();