Javascript中的OADate到毫秒时间戳

Javascript中的OADate到毫秒时间戳,javascript,datetime,timestamp,Javascript,Datetime,Timestamp,我试图做与之完全相反的事情: 从OADate创建毫秒日期(自1970年1月1日起的毫秒数)(自1899年12月30日起的天数为双精度值) 我想我可以这样做: this.unixTimeStampFromOADate = function( OADateFloat) { var oaDateFor1970 = ?? ; //what's the value for 1/1/1970 in OADate format ? var delta = Math.floor

我试图做与之完全相反的事情:

从OADate创建毫秒日期(自1970年1月1日起的毫秒数)(自1899年12月30日起的天数为双精度值)

我想我可以这样做:

this.unixTimeStampFromOADate = function( OADateFloat)
{
        var oaDateFor1970 = ?? ; //what's the value for 1/1/1970 in OADate format ?
        var delta = Math.floor(OADateFloat - oaDateFor1970);

        return delta*(1000*60*60*24); 
}
如果我是对的,我需要OADate格式的1/1/1970的值。
如果我错了,你能建议另一种转换方法吗?

Javascript日期使用的时间值是自1970-01-01T00:00:00Z以来的毫秒。日期1899-12-30的时间值为-2209197600000

要得到从那时起的天数,请获取今天开始时午夜的毫秒数,从OA历元中减去它,除以一天内的毫秒数,得到绝对值。请注意,时间值均为UTC,因此会考虑夏令时、闰年等

var epoch = new Date(1899, 11, 30); // 1899-12-30T00:00:00
var now = new Date();               // 2013-03-22T<current time>
now.setHours(0,0,0,0)               // 2013-03-22T00:00:00

var oaDate  = Math.abs((epoch - now) / 8.64e7); // 41355 for 2013-03-22
input{width:25em}

输入日期:
(DD-MMM-yyy-HH:mm) 办公自动化日期: 回到标准日期:
看看这里,用问题中给出的公式计算一下。如果您输入新日期(0),您将获得oaDate
25569
它应该是从1899年12月30日到1970年1/1的确切天数:/@标记它与我所寻找的完全相反的操作哦,是的,bergi thx如此简单,为什么我不考虑它XD^^那么你同意我的函数吗?+1,尽管你需要使用
Date.UTC
进行
epoch
构造-否则只有生活在GMT的人才会感到幸福我认为,但所有日期都创建为本地日期,因此将考虑本地偏移量,因此应将其取消。严格来说,他们可能都应该使用UTC值,但我在中看不到任何对UTC的引用。使用UTC的主要原因是通过使用公共基准来允许时区,但是OA日期没有任何时区余量,因此尝试对其进行说明似乎不明智。将2013-03T23:59:59转换为OA日期将返回41355.99998842592,将返回相同的日期和时间(全部在当前时区)。在内部转换为UTC并返回将给出完全相同的结果。如果跨时区使用OA日期值,则它实际上与跨时区传递日期和时间字符串相同,没有时区偏移信息。“它实际上与跨时区传递日期和时间字符串相同,没有时区偏移信息”-确定,只是我不知道这是否可取:-)我不熟悉.NET,尽管看起来您可以设置,让它们表示本地日期或utc日期。至少您应该记录您的函数,说明它们对本地时间值进行编码/解码
var toOADate = (function () {
  var epoch = new Date(1899,11,30);
  var msPerDay = 8.64e7;

  return function(d) {
    var v = -1 * (epoch - d)/msPerDay;

    // Deal with dates prior to 1899-12-30 00:00:00
    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) {
    // Deal with -ve values
    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);