编程语言
首页 > 编程语言> > 在java和.net之间转换日期 – 休息2天

在java和.net之间转换日期 – 休息2天

作者:互联网

我需要将.NET DateTime转换为等效的Java Calendar表示.

.NET DateTime使用自1988年1月1日起的Ticks(.NET纪元)作为底层表示.

Java GregorianCalendar使用自1970年1月1日以来的毫秒(Java(或Unix)时代).正如预期的那样,Java纪元之前的日期值为负.

在这里,我正在改变自Java时代以来millis中的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代码段中复制粘贴毫秒值:

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围绕从Julian到Gregorian日历的缺失日期范围(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.

解决方法:

令人惊讶的是,在1582年10月4日至1582年10月15日期间,没有人真正回答过为什么在公历中存在“洞”的问题.有趣的答案是在1582年采用格里高利历的历史到朱利安日历.有关详情,请参见Wikipedia’s article on Gregorian Calendar.历史中的最后一段:格里高利改革段落指出

  • Gregory (Pope Gregory XIII) dropped 10 days to bring the calendar back into synchronisation with the seasons. Accordingly, when the new calendar was put in use, the error accumulated in the 13 centuries since the Council of Nicaea was corrected by a deletion of ten days. The Julian calendar day Thursday, 4 October 1582 was followed by the first day of the Gregorian calendar, Friday, 15 October 1582 (the cycle of weekdays was not affected).*

实际上,格里高利历中不存在1582年10月5日至1582年10月14日的日期.我怀疑.Net Framework使用了一个通用公式,并没有考虑到1582年10月15日之前处理日期时的差异,而Java库确实考虑了它.

标签:gregorian-calendar,java,net,datetime,calendar
来源: https://codeday.me/bug/20191009/1877288.html