为JavaScript日期添加天数

2020/09/18 12:01 · javascript ·  · 0评论

如何Date使用JavaScript 来增加当前日期JavaScript是否具有诸如.Net的内置函数AddDay

您可以使用以下方法创建一个:

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

console.log(date.addDays(5));

这样可以在必要时自动增加月份。例如:

8/31 + 1天将变为9/1

setDate直接使用的问题在于它是一个变种器,最好避免这种事情。ECMA认为适合Date作为可变的类而不是不变的结构。

正确答案

function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}

错误答案

该答案有时会提供正确的结果,但通常会返回错误的年份和月份。该答案唯一有效的时间是您要添加日期的日期恰好具有当前年份和月份。

// Don't do it this way!
function addDaysWRONG(date, days) {
  var result = new Date();
  result.setDate(date.getDate() + days);
  return result;
}

证明/示例

检查这个JsFiddle

var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

注意,因为这可能很棘手。设置“明天”时,它仅起作用,因为其当前值与“今天”的年和月相匹配。但是,将日期号设置为“ 32”通常仍可以将其移至下个月。

我的简单解决方案是:

nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);

此解决方案不存在夏令时的问题。另外,您可以添加/扣除年份,月份,天数等的任何偏移量。

day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);

是正确的代码。

这些答案让我感到困惑,我更喜欢:

var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);

getTime()自1970年以来为我们提供毫秒,并且86400000是一天中的毫秒数。因此,ms包含所需日期的毫秒数。

使用毫秒构造函数可提供所需的日期对象。

尝试

var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));

使用setDate()添加日期不会解决您的问题,请尝试在2月增加几天,如果尝试向其中添加新的日期,则不会达到预期的效果。

遵循下面的示例,花了很长时间才试图弄清当年的交易是不增加的。

如果您只想简单地将n天添加到您拥有的日期,那么最好去:

myDate.setDate(myDate.getDate()+ n);

或长期版本

var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);

今天/明天的事情令人困惑。通过将当前日期设置为新的日期变量,您会弄乱年份值。如果您从原始日期开始工作,则不会。

如果可以,请使用moment.jsJavaScript没有很好的本机日期/时间方法。以下是Moment语法的示例:

var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

参考:http : //momentjs.com/docs/#/manipulating/add/

int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

密码笔

var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);

我昨晚创建了这些扩展程序:

您可以传递正值或负值;

例:

var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);


Date.prototype.addDays = function (num) {
    var value = this.valueOf();
    value += 86400000 * num;
    return new Date(value);
}

Date.prototype.addSeconds = function (num) {
    var value = this.valueOf();
    value += 1000 * num;
    return new Date(value);
}

Date.prototype.addMinutes = function (num) {
    var value = this.valueOf();
    value += 60000 * num;
    return new Date(value);
}

Date.prototype.addHours = function (num) {
    var value = this.valueOf();
    value += 3600000 * num;
    return new Date(value);
}

Date.prototype.addMonths = function (num) {
    var value = new Date(this.valueOf());

    var mo = this.getMonth();
    var yr = this.getYear();

    mo = (mo + num) % 12;
    if (0 > mo) {
        yr += (this.getMonth() + num - mo - 12) / 12;
        mo += 12;
    }
    else
        yr += ((this.getMonth() + num - mo) / 12);

    value.setMonth(mo);
    value.setYear(yr);
    return value;
}

无需使用第二个变量,您可以将x替换为接下来的x天:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));

减去30天使用时间(24h = 86400000ms)

new Date(+yourDate - 30 *86400000)

专为管道运营商设计的解决方案

const addDays = days => date => {
  const result = new Date(date);

  result.setDate(result.getDate() + days);

  return result;
};

用法:

// Without the pipeline operator...
addDays(7)(new Date());

// And with the pipeline operator...
new Date() |> addDays(7);

如果需要更多功能,建议您查看date-fns库。

最简单的解决方案。

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

 // and then call

 var newDate = new Date().addDays(2); //+2 days
 console.log(newDate);

 // or

 var newDate1 = new Date().addDays(-2); //-2 days
 console.log(newDate1);

晚会晚了,但是如果您使用的jQuery话,那么有个很棒的插件叫做Moment:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();

http://momentjs.com/docs/#/manipulating/

还有很多其他好东西!

编辑:由于aikeru的评论,删除了jQuery参考

感谢Jason的回答能按预期工作,这是您的代码和AnthonyWJones方便的格式的结合:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}

我知道老了,但有时候我喜欢这样:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}

提出的解决方案在夏令时方面存在问题。

通过使用getUTCDate/ setUTCDate,我解决了我的问题。

// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
  // Make a working copy so we don't mutate the supplied date.
  const d = new Date(date);

  d.setUTCDate(d.getUTCDate() + num);

  return d;
}

您可以使用JavaScript,不需要jQuery:

var someDate = new Date();
var numberOfDaysToAdd = 6;
someDate.setDate(someDate.getDate() + numberOfDaysToAdd); 
Formatting to dd/mm/yyyy :

var dd = someDate.getDate();
var mm = someDate.getMonth() + 1;
var y = someDate.getFullYear();

var someFormattedDate = dd + '/'+ mm + '/'+ y;

没有变量的通用原型,它适用于现有的Date值:

Date.prototype.addDays = function (days) {
    return new Date(this.valueOf() + days * 864e5);
}

就这么简单:

new Date((new Date()).getTime() + (60*60*24*1000));

setDate()的Mozilla文档未表明它将处理月末情况。参见https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Date

设置日期()

  • 根据当地时间设置指定日期的月份(1-31)。

这就是为什么我需要添加天数时使用setTime()的原因。

我想我也会给出一个答案:就

个人而言,我喜欢避免不必要的变量声明,方法调用和构造函数调用,因为它们在性能上都很昂贵。
(当然,在合理的范围内)


我打算将其保留为@AnthonyWJones给出的答案下的评论,但考虑得更好。

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setTime( 864E5 * days + this.valueOf() ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

以上将尊重DST。这意味着,如果您添加了超过DST的天数,则显示的时间(小时)将发生变化以反映这一点。

范例:


2014年11月2日02:00是夏令时结束。

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 09:30:00

如果您希望保留DST的时间(因此10:30仍将是10:30)...

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setDate( this.getDate() + days ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

所以,现在你有...

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 10:30:00

不,javascript没有内置函数,但是您可以使用简单的代码行

timeObject.setDate(timeObject.getDate() + countOfDays);

我用类似的东西:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)

可以节省时间:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

适用于新年:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

可以参数化:

function DateAdd(source, amount, step) {
  var factor = 1;
  if (step == "day") factor = 24 * 60 * 60 * 1000;
  else if (step == "hour") factor = 60 * 60 * 1000;
  ...
  new Date(source.getTime() + amount * factor);
}

用javascript扩展原型可能不是一个好主意,尤其是在专业代码库中。

您想要做的是扩展本机Date类:

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

这样,如果有一天Javascript实现了本机addDays方法,您将不会破坏任何东西。

为什么这么复杂?

假设您将要添加的天数存储在名为days_to_add的变量中。

那么这个简短的应该做到这一点:

calc_date = new Date(Date.now() +(days_to_add * 86400000));

使用Date.now(),您可以得到实际的unix时间戳(以毫秒为单位),然后添加要添加天数的毫秒数。一天是24小时60分钟 60s * 1000ms = 86400000 ms或864E5。

我实现的最简单的方法是使用Date()本身。`

const days = 15; 
// Date.now() gives the epoch date value (in milliseconds) of current date 
nextDate = new Date( Date.now() + days * 24 * 60 * 60 * 1000)

`

我正在使用以下解决方案。

var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);

Date具有一个接受int的构造函数。此参数表示1970年1月1日之前/之后的总毫秒数。它还具有setTime方法,该方法无需创建新的Date对象即可执行此操作。

我们在这里所做的是将天数转换为毫秒,并将此值添加到getTime提供的值中。最后,我们将结果提供给Date(milliseconds)构造函数或setTime(milliseconds)方法。

编辑:
代替
setTime()(或setHours()),您可以这样做:

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

var tomorrow = new Date().addDays(1);

旧:

除了使用,setTime()您可以使用setHours()

Date.prototype.addDays= function(d){
    this.setHours(this.getHours() + d * 24);
    return this;
};

var tomorrow = new Date().addDays(1);

参见JSFiddle ...

本文地址:http://javascript.askforanswer.com/weijavascriptriqitianjiatianshu.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!