Javascript日期使用的时间值是自1970年01月01日00:00:00Z以来的毫秒数。日期1899-12-30的时间值为-2209197600000。
要获取自那时起的天数,请获取今天开始时刻的午夜的毫秒数,从OA纪元中减去它,除以一天的毫秒数,并获取绝对值。请注意,所有时间值均为UTC,因此考虑了夏令时,闰年等因素。
var epoch = new Date(1899, 11, 30);
var now = new Date();
now.setHours(0,0,0,0)
var oaDate = Math.abs((epoch - now) / 8.64e7);
您可以在此处
测试一些日期(请注意,这些日期使用美国混乱的m/d/yy格式)。
编辑
对不起,理解错误了。 这里有一些双向转换的函数。
还花了一些时间研究了一下“OLE Automation日期实现为浮点数,其整数部分是1899年12月30日午夜前后的天数”,这实际上意味着在1899-12-30 00:00:00之后,而“小数部分表示当天除以24小时的时间”。 换句话说,虽然1899-12-29 00:00:00是-1,但`899-12-29 06:00:00的值为-1.25,而不是-0.75。
无论如何,这些功能现在似乎都有效,但请仔细测试:
var toOADate = (function () {
var epoch = new Date(1899,11,30);
var msPerDay = 8.64e7;
return function(d) {
var v = -1 * (epoch - d)/msPerDay;
var dec = v - Math.floor(v);
if (v < 0 && dec) {
v = Math.floor(v) - dec;
}
return v;
}
}());
var fromOADate = (function() {
var epoch = new Date(1899,11,30);
var msPerDay = 8.64e7;
return function(n) {
var dec = n - Math.floor(n);
if (n < 0 && dec) {
n = Math.floor(n) - dec;
}
return new Date(n*msPerDay + +epoch);
}
}());
var now = new Date();
var oaNow = toOADate(now);
var now2 = fromOADate(oaNow);
alert('Today: ' + now + '\nOADate: ' + oaNow + '\noaNow to Date: ' + now2);
OADate 的规范很混乱,尤其是对负数的处理方式。
2019年2月编辑
更新函数版本,使用本地日期值。
function dateFromOADate (oaDate) {
var days = parseInt(oaDate);
var ms = Math.abs((oaDate - days) * 8.64e7);
return new Date(1899, 11, 30 + days, 0, 0, 0, ms);
}
function dateToOADate (date) {
var temp = new Date(date);
var days = Math.round((temp.setHours(0,0,0,0) - new Date(1899, 11, 30)) / 8.64e7);
var partDay = (Math.abs((date - temp) % 8.64e7) / 8.64e7).toFixed(10);
return days + partDay.substr(1);
}
var now = new Date();
var x = dateToOADate(now);
console.log('Now: ' + now.toString());
console.log('As an OADate: ' + x);
console.log('Back to date: ' + dateFromOADate(x).toString());
window.onload = function(){
var el = document.getElementById('in')
el.addEventListener('change', function() {
var oaDate = dateToOADate(new Date(new Date(el.value)));
document.getElementById('out').value = oaDate;
document.getElementById('out2').value = dateFromOADate(oaDate);
});
}
input {width: 25em}
<table>
<tr>
<td>Input date:<br>(DD MMM YYYY HH:mm)
<td><input id="in" value="29 Dec 1899 06:00">
<tr>
<td>OA Date:
<td><input id="out" readonly>
<tr>
<td>Back to standard date:
<td><input id="out2" readonly>
</table>
new Date(0)
,则会得到 oaDate25569
。 - Bergi