【发布时间】:2013-04-11 13:22:41
【问题描述】:
我需要将 .NET DateTime 转换为等效的 Java Calendar 表示。
.NET DateTime 使用 Ticks 自0001 年 1 月 1 日(.NET 纪元)作为底层表示。
Java GregorianCalendar 使用自1970 年 1 月 1 日(Java(或 Unix)纪元)以来的毫秒数。正如预期的那样,对于 Java 纪元之前的日期,该值为负数。
自 Java 时代以来,我在这里以毫秒为单位转换 DateTime 表示:
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 sn-p 中的毫秒值:
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);
返回 11 天的 TimeSpan,因此 DateTime 运算符不考虑该漏洞。是什么赋予了?我以为底层实现是基于System.Globalization.GregorianCalendar。
【问题讨论】:
-
如果你使用Joda Time会怎样?你能? Joda time 改进了标准 Java 日期,并可能以干净的方式解决您的问题。它还提供到 java.util.Date 和 java.util.Calendar 的转换,因此如果您确实需要使用标准 Java 日期,您可以使用 Joda 时间转换来解决您的问题。
-
这有点像用大炮杀死苍蝇。我 可以 做的是更改 Java 位以调用 calendar.Set(year, month, day, ...) 而不是 calendar.SetTimeInMillis() 并从 .NET DateTime 获取这些字段中的每一个对象的属性。但我也想了解发生了什么。
-
顺便说一句,问题似乎出在 .NET 方面 - 伟大的 JS 已将他的库移植到 .NET:code.google.com/p/noda-time(几天前发布了 v 1.1!)跨度>
-
This is a bit like killing flies with a cannon:是和不是。使用 joda 代替 java.util 正在成为一种标准。从这个意义上说,使用 joda 无论如何都会很好。但我完全同意你句子的第二部分:I also want to understand what's going on。 -
我的印象是,Java 8 有关日期处理的标准化过程正朝着包括 JSR 310 - threeten.sourceforge.net,而不是 JodaTime 的方向发展。
标签: java .net datetime calendar gregorian-calendar