2009-06-27 111 views
1

Flex令我瘋狂,我認爲它是如何處理閏年和沒有閏年的奇怪問題。所以這是我的例子。我有下面的dateDiff方法來查找兩個日期之間的天數或毫秒數。如果我運行以下三條語句,我會遇到一些奇怪的問題。奇怪的彈性日期問題

 dateDiff("date", new Date(2010, 0,1), new Date(2010, 0, 31)); 
    dateDiff("date", new Date(2010, 1,1), new Date(2010, 1, 28)); 
    dateDiff("date", new Date(2010, 2,1), new Date(2010, 2, 31)); 
    dateDiff("date", new Date(2010, 3,1), new Date(2010, 3, 30)); 

如果您要查看上面的日期比較,您期望獲得30,27,30和29作爲日期之間的天數。奇怪的部分是,比較3月1日至3月31日,我得到29。爲什麼?這與2月份只有28天有關嗎?如果有人對此有任何意見,將不勝感激。

public static function dateDiff(datePart:String, startDate:Date, endDate:Date):Number 
    { 
     var _returnValue:Number = 0; 

     switch (datePart) { 
      case "milliseconds": 
       _returnValue = endDate.time - startDate.time; 
       break; 
      case "date": 
       // TODO: Need to figure out DST problem i.e. 23 hours at DST start, 25 at end. 
       // Math.floor causes rounding down error with DST start at dayOfYear 
       _returnValue = Math.floor(dateDiff("milliseconds", startDate, endDate)/(1000 * 60 * 60 * 24)); 
       break; 
     } 

     return _returnValue; 
    } 

回答

4

這不是閏年問題,而是夏時制問題。

要更正代碼以說明DST,您需要查看兩個日期的timezoneOffset以確定日期範圍是否跨越DST邊界。

var adjustment:Number = (startDate.timezoneOffset - endDate.timezoneOffset) * 60 * 1000; 
_returnValue = endDate.time - startDate.time + adjustment; 

這將讓(分鐘)兩個時區之間的差別,該值轉換成毫秒,然後應用時區差到毫秒差「抵消」的DST邊界。

當然,當兩個數字在同一時區時,調整值變爲0,並且時間值不調整。

+0

太棒了!非常感謝您發佈代碼示例。這完美地解決了我的問題。 – CodeMonkey 2009-06-29 17:43:52

0

您的評論部分答案:2010-MAR-01 0:00直到2010-MAR-31 0:00是三十天數減去一個小時(因爲3月14日是DST開始(!)在2010年)。由於你的分區的結果,你會得到29.

編輯:這個答案當然是基於日期的時間屬性考慮夏時制的假設。這會解釋你的問題;然而,我沒有檢查它。