javascript中DateTime.ToOADate()的等价是什么?

本文关键字:是什么 DateTime ToOADate javascript | 更新日期: 2023-09-27 18:08:14

如何在javascript中获得OADate (OLE自动化日期)?我需要以双精度值的形式传递我的date对象(给我的web服务)。

在c#:

var d = DateTime.Now.ToOADate();

在js中等效的是什么?

javascript中DateTime.ToOADate()的等价是什么?

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

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

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

如果你的浏览器提供商没有给你写一个getVarDate方法,自己编写代码并不困难,但是为了使它适用于所有情况,您必须处理一些棘手的特殊情况,包括纪元之前的日期。

我所知道的获得正确代码的最佳方法是首先将其转换为自纪元以来的整数和小数天的原始数,我注意到这是12月的午夜30,而不是31, 1899。一旦有了这些,就可以对before-epoch的值进行特殊处理。

小心舍入!我建议在转换为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

要了解这种奇怪日期格式的更深入历史,请参阅Joel关于他在微软的日子的文章:

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

如果你不能修改web服务,你将不得不重新实现ToOADate()

MSDN说,

OLE自动化日期被实现为一个浮点数,其积分部分是午夜之前或之后的天数,301899年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);

(未测试)

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

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

这些在上面的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;
}

您应该更改您的webservice以采用UNIX时间戳。

你可以在Javascript中调用new Date().getTime(),或者在c#中调用(someDate - new DateTime(1970, 1, 1)).TotalMilliseconds