您一定知道.NET方法“DateTime.FromOADate(double d)”。
我需要在javascript中实现相同的功能。即,给定一个双精度值,例如“40967.6424503935”,它必须转换为“2/28/2012 3:25:07 PM”。
有人能帮我吗?
提前感谢!
提前感谢!
var oaDate = 40967.6424503935;
var date = new Date();
date.setTime((oaDate - 25569) * 24 * 3600 * 1000);
alert(date);
此解决方案创建了一个 UTC 日期。当您显示它时,它将以本地时区的方式显示。根据日期是否为本地日期或 UTC 日期,这是正确的,还是需要进行一些额外的时区调整。
正如@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。
我认为这也是一个简单的解决方案(你可以轻松地将其折叠成一行):
// 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
}