2011-09-08 213 views

回答

4

如果您無法修改網絡服務,則必須重新實施ToOADate()

MSDN說,

的OLE自動化日期是作爲其 不可分割的組成部分是前或午夜後的天數一個浮點數,30 1899年 月,並且其小數部分代表當天 除以24。例如,1899年12月31日午夜爲 代表1.0;早上6點,1900年1月1日2.25;1899年12月29日午夜由-1.0表示;和6AM,29 1899年12月由-1.25表示。

因此,你應該能夠寫類似

var oaDate = (date - new Date(1899, 11, 31))/(24 * 60 * 60 * 1000); 

(未經測試)

+1

爲什麼31?不應該是30? – xanatos

+0

輝煌,與xanatos提到的變化,它完美的作品。 –

+0

@valipour我認爲這是關閉了幾個小時,取決於DST和類似的東西。在意大利,這是1小時。 – xanatos

-1

您應該更改您的web服務以獲取UNIX時間戳。

然後,您可以在Javascript中調用new Date().getTime(),或者在C#中調用(someDate - new DateTime(1970, 1, 1)).TotalMilliseconds

+1

如果是另一個人的web服務,我無法改變它呢? –

8

要轉換一個JScript日期的OLE自動化日期,來電getVarDate:

http://msdn.microsoft.com/en-us/library/4d4x3w61(VS.85).aspx

(如果你去另一種方式 - 也就是說,您有一個JScript對象,並且指定了包含VT_DATE類型變體的屬性--JScript引擎應自動將其轉換爲等效的JScript日期。)

如果您的瀏覽器提供程序沒有執行您的操作禮貌寫一個getVarDate方法,好吧, 自己編寫代碼並不困難,但爲了讓所有情況都正確,你必須處理一些棘手的特殊情況,涉及日期之前的日期。

我知道的最好的方式得到正確的代碼是將其轉化爲原材料數量的整數和分數日以來的時代,這是我注意的是十二月的午夜,不,1899年。一旦你有了,你可以特殊的情況下,前期值。

四捨五入非常小心!我建議您在將轉換爲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.html

1

,對DST有效的解決方案日期還有:

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; 
    }; 

})(); 
0

那些好看的JS以上,但如果你想這樣做轉換成PHP中的Unix時間戳,使用以下命令:

// $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; 
1

markitondemand @ Github上通過以下方式解決它,它佔對於DST

https://github.com/markitondemand/moment-msdate/blob/master/moment-msdate.js

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)); 
}, 
0

與時區偏移修復:

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; 
} 
相關問題