如何使用javascript将OLE自动化日期转换为可读格式?

4
您一定知道.NET方法“DateTime.FromOADate(double d)”。 我需要在javascript中实现相同的功能。即,给定一个双精度值,例如“40967.6424503935”,它必须转换为“2/28/2012 3:25:07 PM”。 有人能帮我吗?
提前感谢!
3个回答

14
自动化日期是自1900年1月1日以来的天数(奇怪地将1900年视为闰年)。因此,转换公式如下:
var oaDate = 40967.6424503935;
var date = new Date();
date.setTime((oaDate - 25569) * 24 * 3600 * 1000);
alert(date);

此解决方案创建了一个 UTC 日期。当您显示它时,它将以本地时区的方式显示。根据日期是否为本地日期或 UTC 日期,这是正确的,还是需要进行一些额外的时区调整。


谢谢您的回复。除了小时和分钟之外,一切都很好。(甚至秒也是正确的!)我得到的是:Tue Feb 28 2012 20:55:07 GMT+0530(印度标准时间)。将尝试按建议进行调整。 - semantic_c0d3r
2
这就完成了:utc = date.getTime() + (date.getTimezoneOffset() * 60000); nd = new Date(utc); alert(nd.toLocaleString()); - semantic_c0d3r
1
OLE日期实际上是基于1899年12月30日的。例如,参见MSDN中的DateTime.ToOADate。 - donovan

0

正如@donovan所分享的,它实际上是从1899年12月30日开始计算的。 .net函数文档

OLE自动化日期被实现为一个浮点数,其整数部分是距离1899年12月30日午夜之前或之后的天数,其小数部分表示当天时间除以24。例如,1899年12月31日午夜表示为1.0;1900年1月1日上午6点表示为2.25;1899年12月29日午夜表示为-1.0;1899年12月29日上午6点表示为-1.25。


0

我认为这也是一个简单的解决方案(你可以轻松地将其折叠成一行):

     // distance from ole to epoch in milliseconds. 
     // We need to invert sign later (bc it is before epoch!) 
     const oleToEpoch = new Date("12/30/1899")).getTime() 
     // distance from ole to target (our number
     const oleToTarget = 40967.6424503935*24*60*60*1000
     // + because of sign change
     const resultInMs = oleToTarget + oleToEpoch  
     // useIndia timezone
     console.log(new Date(resultInMs).toLocaleString("en-IN"))

     // distance from ole to epoc in milliseconds
     const oleToEpoch = new Date("12/30/1899").getTime() 
     const oleToTarget = 40967.6424503935*24*60*60*1000
     // + because of sign change
     const resultInMs = oleToTarget + oleToEpoch  
     console.log(new Date(resultInMs).toLocaleString("en-IN"))

我已将它做成一个小函数:
     // distance from ole to epoc in milliseconds
     function oleToDate(ole, timezone) {
       const oleToEpoch = new Date("12/30/1899").getTime()
       const oleToTarget = ole * 24 * 60 * 60 * 1000
       // + because of sign change
       const resultInMs = oleToTarget + oleToEpoch
       const result = new Date(resultInMs)
       if (timezone) {
         return result.toLocaleString(timezone)
       }
       return result
     }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接