2011-02-25 140 views
2

我知道如何在php中用date()和mktime()函數做到這一點,但不知道如何完成相同的事情在JavaScript ...javascript:我如何增加日期字符串(YYYY-MM-DD)1天

function incr_date(date_str){ 
    //...magic here 
    return next_date_str; 
} 

var date_str = '2011-02-28'; 
console.log(incr_date(date_str)); //want to output "2011-03-01" 

這甚至可以與js?

+0

轉到http://stackoverflow.com/a/8295943/792103的答案 – jalil 2011-11-28 12:42:00

回答

10

首先你解析它,然後你使用dt.setDate(dt.getDate() + 1)。但是,您必須手動解析它,或使用DateJS或類似的;該格式尚未在所有主流瀏覽器中支持(new Date(date_str)將無法​​正常工作可靠跨瀏覽器;請參閱下面的註釋)。然後將其轉換回您的格式。

這些方針的東西:

function incr_date(date_str){ 
    var parts = date_str.split("-"); 
    var dt = new Date(
    parseInt(parts[0], 10),  // year 
    parseInt(parts[1], 10) - 1, // month (starts with 0) 
    parseInt(parts[2], 10)  // date 
); 
    dt.setDate(dt.getDate() + 1); 
    parts[0] = "" + dt.getFullYear(); 
    parts[1] = "" + (dt.getMonth() + 1); 
    if (parts[1].length < 2) { 
    parts[1] = "0" + parts[1]; 
    } 
    parts[2] = "" + dt.getDate(); 
    if (parts[2].length < 2) { 
    parts[2] = "0" + parts[2]; 
    } 
    return parts.join("-"); 
} 

Live example

注意setDate正確處理滾動到下個月(和年如果需要的話)。

Live example

上述被測試和工程上IE6,IE7,IE8; Chrome上的Chrome,Opera和Firefox; Chrome,Opera,Firefox和Safari。

有關此格式支持JavaScript的注意事項:new Date(string)構造在JavaScript中只有最近不得不將接受標準化的格式,在2009年12月發佈的ECMAScript 5th edition當瀏覽器都支持您的格式將得到支持,但作爲在這篇文章中,沒有發佈的IE版本(甚至沒有IE8)支持它。其他最近的瀏覽器大多都是。

+0

你是否認爲標準的Date對象的構造不跨的browers一貫的執行? – Andrea 2011-02-25 11:37:40

+0

@Andrea:是的,他需要的Date構造函數的版本還沒有得到可靠的支持。在第5版規範之前,「新日期(字符串)」沒有**標準格式,僅在14個月前發佈。試試任何目前發佈的IE版本(包括IE8):http://jsbin.com/omoka4 – 2011-02-25 11:47:25

+0

哦,我明白了。我認爲ES3會盡可能定義一些標準格式,這些格式需要被Date構造函數接受。 – Andrea 2011-02-25 11:50:17

0

是的。首先,你閱讀的日期和你轉換到一個日期對象,那麼你加1天,返回結果

function incrementDate(date_str) { 
    var date = new Date(date_str); 
    date.setDate(date.getDate() + 1); 
    return date.getFullYear() + '-' + date.getMonth() + '-' + date.getDate(); 
} 

Date object,這是原產於JavaScript中,負責從閏年等產生的所有問題。

+1

減去一天? – Jamiec 2011-02-25 11:33:13

+0

對不起,這是添加一天,我編輯它。 – Andrea 2011-02-25 11:35:36

+0

'新日期(「2011-02-28」)'不適用於任何當前版本的IE。並且你已經在他的結果字符串中刪除了零填充。 – 2011-02-25 11:46:24

3

首先,您需要將日期字符串轉換爲Date對象。

var date = new Date('2011-02-28'); 

然後,您需要添加一個日期部分的日期。

date.setDate(d.getDate() + 1); 

雖然這看起來可能會在2月29日結束,但它不會,並且會在3月1日結束。

+2

*「'var date = new Date('2011-02-28');'」*不適用於任何**當前發佈的IE版本(包括IE8)。 – 2011-02-25 11:51:46

+0

是的,因爲2011年不是閏年。 – nyuszika7h 2011-02-25 11:56:37

+0

@ Nyuszika7H:閏年不會進入它(2月總是有28日)。這是新格式(僅在14個月前標準化),尚未得到廣泛支持。如果你在談論'date.setDate(d.getDate()+ 1)',JavaScript會處理你的月份(如果需要的話)。 – 2011-02-25 11:58:45

4

如果您正在使用jQuery的& jQuery UI的然後使用以下命令:

var dt = $.datepicker.parseDate('yy-mm-dd', '2011-02-25'); 
dt.setDate(dt.getDate() + 1) 
var dtNew = $.datepicker.formatDate('yy-mm-dd', dt); 

您可以parseformat任何你想要的方式,最重要的是你並不需要在你的JS庫中的新功能。

0

我希望這將有助於

function incr_date(date_str,no_of_days_to_add){ 
var futureDate=new Date(date_str); 

    futureDate.setDate(new Date().getDate()+no_of_days_to_add); 
    var next_date_str= futureDate; 

    return next_date_str; 
} 
1

我修改了這個優秀的答案https://stackoverflow.com/a/5116693/4021614任何量同時處理遞增和遞減(使用此方法https://stackoverflow.com/a/25114400/4021614)。

function incrementDate(date_str, incrementor) { 
    var parts = date_str.split("-"); 
    var dt = new Date(
     parseInt(parts[0], 10),  // year 
     parseInt(parts[1], 10) - 1, // month (starts with 0) 
     parseInt(parts[2], 10)  // date 
    ); 
    dt.setTime(dt.getTime() + incrementor * 86400000); 
    parts[0] = "" + dt.getFullYear(); 
    parts[1] = "" + (dt.getMonth() + 1); 
    if (parts[1].length < 2) { 
     parts[1] = "0" + parts[1]; 
    } 
    parts[2] = "" + dt.getDate(); 
    if (parts[2].length < 2) { 
     parts[2] = "0" + parts[2]; 
    } 
    return parts.join("-"); 
}; 

例如:

//increment by 7 days 
incrementDate('2015-01-01', 7); 
//returns '2015-01-08' 

//decrement by 1 day 
incrementDate('2015-01-01', -1); 
//returns '2014-12-31' 
相關問題