2011-09-08 125 views

回答

4

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

MSDN说,

的OLE自动化日期是作为其 不可分割的组成部分是前或午夜后的天数一个浮点数,30 1899年 月,并且其小数部分代表当天 除以24。例如,1899年12月31日午夜为 代表1.0;早上6点,1900年1月1日2.25;1899年12月29日午夜由-1.0表示;和6AM,29 1899年12月由-1.25表示。

因此,你应该能够写类似

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

(未经测试)

+1

为什么31?不应该是30? – xanatos

+0

辉煌,与xanatos提到的变化,它完美的作品。 –

+0

@valipour我认为这是关闭了几个小时,取决于DST和类似的东西。在意大利,这是1小时。 – xanatos

-1

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

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

+1

如果是另一个人的web服务,我无法改变它呢? –

8

要转换一个JScript日期的OLE自动化日期,来电getVarDate:

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

(如果你去另一种方式 - 也就是说,您有一个JScript对象,并且指定了包含VT_DATE类型变体的属性--JScript引擎应自动将其转换为等效的JScript日期。)

如果您的浏览器提供程序没有执行您的操作礼貌写一个getVarDate方法,好吧, 自己编写代码并不困难,但为了让所有情况都正确,你必须处理一些棘手的特殊情况,涉及日期之前的日期。

我知道的最好的方式得到正确的代码是将其转化为原材料数量的整数和分数日以来的时代,这是我注意的是十二月的午夜,不,1899年。一旦你有了,你可以特殊的情况下,前期值。

四舍五入非常小心!我建议您在将转换为OA格式之前将值舍入到最接近的秒。因为OA格式是-1.9999999就在1899年12月30日的午夜之前,而-2.0是12月28日的午夜,所以如果你把前者变成后者,你只需要将一秒的时间舍入为一个两天的误差。

关于OA格式怪癖的详情,请参阅我的文章从2003年的主题:

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

而对于一个有趣的看看这个奇怪日期格式的更深层次的历史,看到乔尔的一篇关于他的微软天:

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

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

})(); 
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; 
1

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)); 
}, 
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; 
} 
相关问题