使用Javascript将天数添加到日期

11

我正在尝试使用JavaScript在给定日期上添加天数。我有以下代码:

function onChange(e) {
    var datepicker = $("#DatePicker").val();
    alert(datepicker);
    var joindate = new Date(datepicker);
    alert(joindate);
    var numberOfDaysToAdd = 1;
    joindate.setDate(joindate + numberOfDaysToAdd);
    var dd = joindate.getDate();
    var mm = joindate.getMonth() + 1;
    var y = joindate.getFullYear();
    var joinFormattedDate = dd + '/' + mm + '/' + y;
    $('.new').val(joinFormattedDate);
}

第一次警报,我获得了日期24/06/2011,但第二次警报,我获得了错误的日期Thu Dec 06 2012 00:00:00 GMT+0500 (Pakistan Standard Time),我希望它仍然是24/06/2011,以便我可以添加天数。在我的代码中,我希望最终输出为25/06/2011

Fiddle地址为 @ http://jsfiddle.net/tassadaque/rEe4v/


日期应该是 m/d/yyyy,否则会得到意想不到的结果。请参考我的答案解释。 - Salman A
这个和我的、Gedrox的以及Alnitak的有关。在你之前,所有人都指出了这点... - mplungjan
@mplungjan和我是唯二实际使用DatePicker本身返回正确Date对象的人... - Alnitak
请看我的评论。我认为@Tassadaque发布的整个函数可以用$('.new').val($("#DatePicker").datepicker( "setDate" , +1 ));替换。 - mplungjan
@mplungjan 不行,因为 .datePicker("setDate") 没有返回值 - Alnitak
10个回答

22

Date('string') 会尝试将字符串解析为 m/d/yyyy 格式。因此,字符串 24/06/2011 将被解析成 Dec 6, 2012。原因是:24 被视为月份……1 表示 2011 年 1 月,13 表示 2012 年 1 月,因此 24 表示 2012 年 12 月。希望您理解我的意思。所以:

var dmy = "24/06/2011".split("/");        // "24/06/2011" should be pulled from $("#DatePicker").val() instead
var joindate = new Date(
    parseInt(dmy[2], 10),
    parseInt(dmy[1], 10) - 1,
    parseInt(dmy[0], 10)
);
alert(joindate);                          // Fri Jun 24 2011 00:00:00 GMT+0500 (West Asia Standard Time) 
joindate.setDate(joindate.getDate() + 1); // substitute 1 with actual number of days to add
alert(joindate);                          // Sat Jun 25 2011 00:00:00 GMT+0500 (West Asia Standard Time)
alert(
    ("0" + joindate.getDate()).slice(-2) + "/" +
    ("0" + (joindate.getMonth() + 1)).slice(-2) + "/" +
    joindate.getFullYear()
);

在这里查看演示


我认为在你回答之前,我们已经多次确认过这一点了。 - mplungjan
1
@mplungjan:还没有人准确指出为什么月/日会变成2012年12月。只是想帮忙。 - Salman A
我收到了无效日期警报。 - Tassadaque
是的,我说过:第二个是从非美国格式日期生成的日期。Alnitak说:“你试图解析DatePicker的文本值,但这不是你所在地区的正确格式。” - mplungjan
@Tassadaque:单独看上面的例子不应该产生任何无效日期。哪个警报是无效的?第一个吗?如果是这样,你能告诉我 $("#DatePicker").val() 给你什么吗? - Salman A
显示剩余5条评论

5
我建议你使用DateJS库,它非常棒!
function onChange(e) {
    var date = Date.parse($("#DatePicker").val()); //You might want to tweak this to as per your needs.
    var new_date = date.add(n).days();
    $('.new').val(new_date.toString('M/d/yyyy'); //You might want to tweak this as per your needs as well.
}

过度杀伤力了。特别是如果datePicker本身可以完成工作。 - mplungjan
2
@mplungjan 可能是这样,尽管这是主观的,在任何合理的应用程序中,日期操作都是必须的,像 DateJS 这样的东西可以帮助你编写非常整洁和简单的代码,我认为它绝对值得带来的小占用空间。今天你只想添加几天,明天你可能想做更多的事情。 - Dhruva Sagar

5
假设numberOfDaysToAdd是一个数字:
joindate.setDate(joindate.getDate() + numberOfDaysToAdd);

4

第一个警报是字段的值。第二个警报是从非美国格式日期生成的日期。

这里有一个工作示例

(似乎需要这种标记才能被注意到)

如果您想保留您的代码,则需要更改

var joindate = new Date(datepicker);

var parms = datepicker.split("/");

然后使用。
var joindate = new Date(parms[1]+"/"+parms[0]+"/"+parms[2]);

或者是完全相同的工作

var joindate = new Date(parms[2],parms[1]-1,parms[0]);

正如其他答案中指出的那样,使用 .getDate() 方法。
joindate.setDate(joindate.getDate() + numberOfDaysToAdd);

最后,如果月份< 10,则要添加0。
if (mm<10) mm="0"+mm;

如果您正在使用jQuery UI的日期选择器,则可以执行以下操作: $('.new').val($("#DatePicker").datepicker("setDate", +1).val());
而不是使用您的函数。

http://jqueryui.com/demos/datepicker/#method-setDate

设置datepicker的当前日期。新日期可以是一个Date对象或一个字符串,格式为当前日期格式(例如“01/26/2009”),表示距今天的天数(例如+7)或一串值和周期的字符串('y'代表年,'m'代表月,'w'代表周,'d'代表日,例如“+1m +7d”),或null以清除所选日期。

错误已经被修复,但是joinFormattedDate仍然给我NaN/NaN/NaN :( - Tassadaque
Date(Date.parse("...")) 是多余的。只需使用 Date("...") - Salman A
joindate.setDate(joindate.getDate() + numberOfDaysToAdd); 加入日期.设置日期(加入日期.获取日期() + 添加的天数); - mplungjan
@mplungjan,我希望我能接受不止一个答案。在你之前,我一直在关注他的答案,并且它解决了问题,所以我在他添加演示链接之前就接受了他的答案,正如上面的评论所表明的那样。我感谢你的努力,并希望将来能得到你的帮助 :) - Tassadaque
@mplungjan 你本可以为“这里是工作示例”使用不同的颜色 :P - Muhammad Adeel Zahid
显示剩余3条评论

3

尝试

function onChange(e) {
        var datepicker = $("#DatePicker").val();
        alert(datepicker);
        var parts = datepicker.split(/[^\d]/);
        var joindate = new Date();
        joindate.setFullYear(parts[2], parts[1]-1, parts[0]);
        alert(joindate);
        var numberOfDaysToAdd = 1;
        joindate.setDate(joindate + numberOfDaysToAdd);
        var dd = joindate.getDate();
        var mm = joindate.getMonth() + 1;
        var y = joindate.getFullYear();
        var joinFormattedDate = dd + '/' + mm + '/' + y;
        $('.new').val(joinFormattedDate);

    }

我认为问题在于JavaScript在传递到Date构造函数时期望的格式是MM/DD/YYYY而不是DD/MM/YYYY。


当我警告joinFormattedDate时,它给了我NaN/NaN/NaN,我也是这么想的。 - Tassadaque
为什么要使用两个语句来设置日期?var joindate = new Date(parts[2], parts[1]-1, parts[0]);比重载setFullYear更合理且更易懂。您还遗漏了joindate.getDate()+。 - mplungjan

2
为了回答你的实际问题,我认为你的问题在于你试图解析DatePicker的文本值,但这不符合你所在地区的正确格式。
请使用以下代码替换.val():
```javascript .getDate().toLocaleDateString() ```
```html

要解决你的问题,我认为你的问题在于你试图解析DatePicker的文本值,但这不符合你所在地区的正确格式。

请使用以下代码替换.val():

```
var joindate = $('#DatePicker').datepicker("getDate");

从jQuery直接获取代表所选日期的基础Date()对象。这样可以保证日期对象的正确性,而不受DatePicker指定的日期格式或当前语言环境的影响。

然后使用以下代码:

joindate.setDate(joindate.getDate() + numberOfDaysToAdd);

将其移动。


@mplungjan 一个 Date() 对象在内部只是自纪元以来的毫秒偏移,它怎么可能是 "不正确" 的呢? - Alnitak
如果你使用非美国格式的日期(例如dd/mm/yyyy)构建日期并期望它是正确的,那么日期是不正确的。你已经改变了你的答案以使其更易理解。 - mplungjan
文档建议使用 ".datepicker(“setDate”,+1)"。 - mplungjan
@mplungjan 这将更改日期选择器中当前显示的内容,但您仍需要使用getDate来检索值。 - Alnitak
当然可以,但如果你只想添加一天,就根本不需要使用getDate。 - mplungjan
@mplungjan 当然可以,如果你想将它复制到另一个字段中(就像 OP 的代码所做的那样)。 - Alnitak

1

joindate.setDate(joindate + numberOfDaysToAdd)这里是一个笔误吗?

我尝试了这段代码,对我来说似乎没问题。

    var joindate = new Date(2010, 5, 24);
    alert(joindate);
    var numberOfDaysToAdd = 1;
    joindate.setDate(joindate.getDate() + numberOfDaysToAdd);
    var dd = joindate.getDate();
    var mm = joindate.getMonth() + 1;
    var y = joindate.getFullYear();
    var joinFormattedDate = dd + '/' + mm + '/' + y;
    alert(joinFormattedDate);

你解决了一半的问题。首先要获取正确的日期。.getDate() 是第二个问题。 - mplungjan

1
Date.prototype.addDays = function(days) {
    this.setDate(this.getDate() + days);
    return this;
};

在你的 JavaScript 代码中,你可以调用

var currentDate = new Date();
// to add 8 days to current date
currentDate.addDays(8);

0
function onChange(e) {
    var datepicker = $("#DatePicker").val().split("/");
    var joindate = new Date();
    var numberOfDaysToAdd = 1;
    joindate.setFullYear(parseInt(datepicker[2]), parseInt(datepicker[1])-1, parseInt(datepicker[0])+numberOfDaysToAdd);
    $('.new').val(joindate);
}

http://jsfiddle.net/roberkules/k4GM5/


实际上,我的日期选择器的值是“26/06/2011”,而不是“06/24/2011”,我认为这是根本原因。如果我更改您的fiddle,它会显示无效日期,当我运行它时,它会给我错误的日期。 - Tassadaque

-1

试一下这个。

Date.prototype.addDay = function(numberOfDaysToAdd){
    this.setTime(this.getTime() + (numberOfDaysToAdd * 86400000));
};

function onChange(e) {
        var date = new Date(Date.parse($("#DatePicker").val()));
        date.addDay(1);
        var dd = date.getDate();
        var mm = date.getMonth() + 1;
        var y =  date.getFullYear();
        var joinFormattedDate = dd + '/' + mm + '/' + y;
        $('.new').val(joinFormattedDate);
    }

这并没有以一种有用的方式回答问题。你为什么认为这是答案?它是如何工作的?仅仅告诉别人“改变他们的代码”或者只是“给别人一个可用的代码”,而没有任何上下文或意义,这并不能帮助他们学习他们做错了什么,也不太有用于未来的读者。 - GrumpyCrouton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接