2014-10-06 164 views
3

給定開始日期和天數,我需要顯示結束日期=開始日期+天數。考慮夏令時的兩個日期之間的差異

所以我做了這樣的事情:

var endDate=new Date(startDate.getTime()+ONE_DAY); 

一切正常,但25日和26日給少開一天。

例:

2014-01-01 + 2 days = 2014-01-03 

2014-10-25 + 2 days = 2014-10-26 (here is the case I need to treat). 

這種差異出現,因爲時鐘要回1小時。實際上2014-10-27 00:00:00變成2014-10-26 23:00:00

一個簡單的解決方案是在另一個小時計算(例如上午3點)。但是我想在這種情況發生時顯示一個註釋。

例如,如果用戶輸入2014-10-25,我會顯示一個彈出窗口說[something]。

現在,這裏是真正的問題......我似乎無法找到說,任何​​算法時的時鐘可以追溯到在今年十

例......在2014年的一天是10月26日。 2016年是10月30日(https://www.gov.uk/when-do-the-clocks-change)。爲什麼?這個日期看起來是隨機的,但我不認爲它是。那麼......時鐘何時回退/前進?

編輯:所有的答案/評論有助於如何解決這個問題。但是......我已經通過了這個舞臺。現在我只有一句關於「計算時鐘的時間到底如何計算?」的癢癢。

+0

如果您不反對使用圖書館,我會強烈建議使用moment.js和時區時區,但在處理這些情況時會帶來很多麻煩(http://momentjs.com/) – Quince 2014-10-06 07:37:11

+0

夏令時不是基於特定的日期,通常在特定月份的第一個星期日的02:00,隨着地方採用或停止使用而頻繁變化,或者只是更改開始的一週,因爲它似乎是一個好主意。沒有一致性,儘管赤道附近的國家傾向於不使用它比靠近兩極的國家更多。 – RobG 2014-10-06 08:16:11

回答

2

要查找整天兩個日期之間的差別,創建日期對象,減去從另一個,然後通過在一個毫秒劃分一整天。剩餘時間只有1小時才能用於夏令時,因此會輪到正確的值。

您可能還需要一個小功能將字符串轉換爲日期:

// Return Date given ISO date as yyyy-mm-dd 
function parseISODate(ds) { 
    var d = ds.split(/\D/); 
    return new Date(d[0], --d[1], d[2]); 
} 

獲取天的區別:

function dateDiff(d0, d1) { 
    return Math.round((d1 - d0)/8.64e7); 
} 

// 297 
console.log(dateDiff(parseISODate('2014-01-01'), parseISODate('2014-10-25'))); 

如果你想天添加日期,這樣做:

// Add 2 days to 2014-10-25 
var d = new Date(2014, 9, 25); 
d.setDate(d.getDate() + 2); 

console.log(d); // 2014-10-27 

內置的Date對象考慮到夏令時(認爲有bug在一些瀏覽器中)。

1

我更喜歡加入天是這樣的:

var startDate = //someDate; 

    var endDate = new Date(startDate.getFullYear(), 
       startDate.getMonth(), 
       startDate.getDate()+1); 

這樣你就不必擔心在日曆天。

此代碼添加1天,如果您想添加更多,請將startDate.getDate()+1更改爲startDate.getDate()+NUMBER_OF_DAYS,即使您處於月份的最後一天,即10月31日,也可以正常工作。

但是,也許你可以使用@RobG解決方案,它是更優雅比我

+0

不,.getMonth()爲您提供基於月份的0-索引,我的意思是從0到11,但是當您使用新的時候,您必須將月份設置爲1-12:http://www.w3schools.com/jsref/ jsref_getmonth.asp – Balder 2014-10-06 08:04:32

+0

我不想自大,但我的鏈接字面意思是:「定義和用法 getMonth()方法根據當地時間返回指定日期的月份(從0到11)。」這是我在評論中所說的。在ECMAScript refence中還說:「月份號 月份由0到11之間的一個整數標識(包括0和11)。從時間值t到月份號的映射MonthFromTime(t)定義爲:」http:/ /ecma-international.org/ecma-262/5.1/#sec-15.9.1.4 – Balder 2014-10-06 08:45:49

+0

我測試過了,你是對的!我做了新的日期(2000,1,1),它實例化了2月1日,而不是1月1日。神話爲我而死!感謝您的信息,並抱歉固執!我會去編輯它。順便說一下,我更喜歡你的解決方案,它更優雅。 – Balder 2014-10-07 07:13:46