什么相当于javascript中的DateTime.ToOADate()?

如何在javascript中获取OADate(OLE自动化日期)? 我需要以double值的forms传递我的日期对象(到我的Web服务)。

在c#中:

var d = DateTime.Now.ToOADate(); 

什么是js中的等价物?

如果您无法修改Web服务,则必须重新实现ToOADate()

MSDN说,

OLE自动化日期实现为浮点数,其积分分量是1899年12月30日午夜之前或之后的天数,其小数部分表示当天的时间除以24.例如,12月31日午夜1899年由1.0表示; 1900年1月1日上午6点由2.25表示; 1899年12月29日午夜以-1.0表示; 1899年12月29日上午6点用-1.25表示。

因此,你应该能够写出类似的东西

 var oaDate = (date - new Date(1899, 11, 31)) / (24 * 60 * 60 * 1000); 

(另)

要将JScript日期转换为OLE自动化日期,请调用getVarDate:

http://msdn.microsoft.com/en-us/library/4d4x3w61(VS.85).aspx

(如果你采用另一种方式 – 也就是说,你有一个JScript对象并且你分配了一个包含VT_DATE类型变体的属性 – JScript引擎应该自动将它转换为等效的JScript日期。)

如果您的浏览器提供商没有按照编写getVarDate方法的方式来做,那么自己编写代码并不困难,但为了使所有情况都正确,您必须处理一些涉及日期之前的特殊情况。时代。

我知道要获得正确代码的最好方法是首先将其转换为自纪元以来的整数和分数天的原始数,我注意到它是12月30日午夜,而不是1899年。一旦你有了,你可以特殊情况的前纪元值。

四舍五入要非常小心! 我建议您在转换为OA格式之前将值舍入到最接近的秒。 因为OA格式是-19999999就在1899年12月30日午夜之前,但是-2.0是12月28日午夜,如果你将前者围绕到后者,你只需将一小部分时间缩短为两天误差。

有关OA格式怪癖的详细信息,请参阅2003年关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2003/09/16/53013.aspx

有趣地看看这个奇怪日期格式的更深层历史,请参阅Joel关于他微软时代的文章:

http://www.joelonsoftware.com/items/2006/06/16.html

适用于DST日期的解决方案:

 var toOADate = (function () { /** @const */ var utc18991230 = Date.UTC(1899, 11, 31); /** @const */ var msPerDay = 24 * 60 * 60 * 1000; return function (date) { if (date instanceof Date) { date = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); } return (date - utc18991230) / msPerDay; }; })(); 

markitondemand @ Github以下列方式解决了它并且它解释了夏令时

https://github.com/markitondemand/moment-msdate/blob/master/moment-msdate.js

 toOADate: function (date) { var timezoneOffset = date.getTimezoneOffset() / (60 * 24); var msDateObj = (date.getTime() / 86400000) + (25569 - timezoneOffset); return msDateObj; }, fromOADate: function (oadate) { var date = new Date(((oadate - 25569) * 86400000)); var tz = date.getTimezoneOffset(); return new Date(((oadate - 25569 + (tz / (60 * 24))) * 86400000)); }, 

这些对于JS来说看起来不错,但是如果你想将它转换为PHP中的Unix时间戳,请使用以下命令:

 // $ms_date_floating_point is the MS date // 42372.3432210648 converts to Sun Jan 3rd, 2016 $ms_date_seconds = $ms_date_floating_point * 60 * 60 * 24; $unix_timestamp_seconds = strtotime("Nov 11, 1899 00:00:00") + $ms_date_seconds; 

带时区偏移修复:

 function toOADate(date) { var msPerDay = 24 * 60 * 60 * 1000; var baseDate = new Date("1899-12-30T00:00:00.000+0000"); return (date.getTime() - baseDate.getTime() - 60*1000*getTimezoneOffset()) / msPerDay; } 

您应该更改Web服务以获取UNIX时间戳。

然后,您可以在Javascript中调用new Date().getTime() ,或者(someDate - new DateTime(1970, 1, 1)).TotalMilliseconds C#中的(someDate - new DateTime(1970, 1, 1)).TotalMilliseconds