如何在 javascript 中获取 OADate(OLE 自动化日期)?我需要以双值的形式传递我的日期对象(到我的网络服务)。
在 C# 中:
var d = DateTime.Now.ToOADate();
js中相当于什么?
要将 JScript 日期转换为 OLE 自动化日期,请调用 getVarDate:
http://msdn.microsoft.com/en-us/library/4d4x3w61(VS.85).aspx
(如果您采取另一种方式——也就是说,您有一个 JScript 对象并分配一个包含 VT_DATE 类型变体的属性——JScript 引擎应该自动将其转换为等效的 JScript 日期。)
如果您的浏览器提供商没有为您提供编写 getVarDate 方法的礼貌,那么, 自己编写代码并不困难,但为了使其适用于所有情况,您必须处理一些涉及纪元之前的日期的棘手特殊情况。
据我所知,获得正确代码的最佳方法是首先将其转换为自纪元以来的整数和小数天数的原始数量,我注意到是1899年12月30的午夜,而不是31。一旦你有了这个,您可以对纪元之前的值进行特殊处理。
四舍五入时要非常小心!我建议您在转换为 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.htmlToOADate()
。
MSDN 说,
OLE 自动化日期被实现为浮点数,其 整数部分是午夜之前或之后的天数,30 1899 年 12 月,其小数部分代表时间 当天除以 24。例如,1899 年 12 月 31 日午夜为 用1.0表示; 1900 年 1 月 1 日上午 6 点用 2.25 表示; 1899 年 12 月 29 日午夜用 -1.0 表示;和 29 日早上 6 点 1899 年 12 月用 -1.25 表示。
因此,你应该能够写出类似的东西
var oaDate = (date - new Date(1899, 11, 31)) / (24 * 60 * 60 * 1000);
(未经测试)
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));
},
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;
};
})();
// $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;
}
然后您可以在 Javascript 中调用
new Date().getTime()
,或在 C# 中调用
(someDate - new DateTime(1970, 1, 1)).TotalMilliseconds
。