我需要将一个 .NET 的 DateTime
转换为等价的 Java Calendar
表示。
.NET 的 DateTime
使用自 0001 年 1 月 1 日(.NET 纪元)以来的 Ticks
作为底层表示。
Java 的 GregorianCalendar
使用自 1970 年 1 月 1 日(Java(或 Unix)纪元)以来的毫秒数。对于 Java 纪元之前的日期,该值为负数,这是预期的。
在这里,我将 DateTime
表示转换为自 Java 纪元以来的毫秒数:
var dt = new DateTime(1,2,3); //way, way back.
var javaEpoch = new DateTime(1970, 1, 1);
var javaMillis = (dt - javaEpoch).Ticks / TimeSpan.TicksPerMillisecond;
dt.ToString("MM/dd/yyyy").Dump(); // .Dump() is provided by LinqPad.
javaMillis.Dump(); // Use Console.WriteLine(...)
// for a regular console app.
这将输出:
02/03/0001
-62132745600000
现在将毫秒值复制粘贴到此Java代码片段中:
java.util.Calendar cal = new java.util.GregorianCalendar();
cal.setTimeInMillis(-62132745600000L);
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat();
df.applyPattern("MM/dd/yyyy");
System.out.println(df.format(cal.getTime()));
这将输出:
02/05/0001
我的问题是:我应该如何从DateTime获取有效的毫秒值,以正确地构建Java日历?同时也有一个隐含的子问题:“这到底是怎么回事?”
编辑:我尝试使用DateTimeValues解决儒略历到格里高利历之间缺失日期范围的问题(1582年10月4日“后面”是1582年10月15日)。
对于比1582年10月15日更近的日期,转换似乎正常工作。
...但在缺失的范围周围,DateTime开始(或者说,没有开始)表现得很奇怪:
var timespan = new DateTime(1582, 10, 15) - new DateTime(1582, 10, 4);
返回一个TimeSpan
,表示11天的时间间隔,因此DateTime运算符不考虑这个空洞。这是怎么回事呢?我以为底层实现基于System.Globalization.GregorianCalendar
。