有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纳秒间隔数"。
DateTime
、UnixEpoch
中有一个内部字段,其值为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
格里高利历中是否存在一种只有一个平台才会考虑的差距?
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();