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

时间:2011-09-08 13:26:32

标签: c# javascript

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

在c#中:

var d = DateTime.Now.ToOADate();

js中的等价物是什么?

7 个答案:

答案 0 :(得分:9)

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

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

(如果你反过来 - 也就是说,你有一个JScript对象并且你分配了一个包含VT_DATE类型变体的属性 - JScript引擎应该自动将它转换为等价的JScript日期。)

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

我知道要获得正确代码的最佳方法是首先将其转换为自纪元以来的整数和分数天的原始数,我注意到它是12月的午夜 30 ,而不是< em> 31 ,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

答案 1 :(得分:5)

如果您无法修改网络服务,则必须重新实施ToOADate()

MSDN说,

  

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

因此,您应该能够编写类似

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

(未测试的)

答案 2 :(得分:2)

markitondemand @ Github以下列方式解决了它并且它解释了DST

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));
},

答案 3 :(得分:1)

适用于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;
    };

})();

答案 4 :(得分:0)

上面的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;

答案 5 :(得分:0)

带时区偏移修复:

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;
}

答案 6 :(得分:-1)

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

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