我需要将 .NETDateTime
转换为等效的 JavaCalendar
表示。
.NETDateTime
使用Ticks
自0001 年 1 月 1 日(.NET 纪元)以来的底层表示。
自1970 年 1 月 1 日(Java(或 Unix)时代)以来,JavaGregorianCalendar
使用毫秒。正如预期的那样,对于 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 天的 a,因此 DateTime 运算符不考虑该漏洞。是什么赋予了?我认为底层实现是基于System.Globalization.GregorianCalendar
.