JavaScript'te bir tarihi artırma


Yanıtlar:


791

Sizin için üç seçenek:

1. Yalnızca JavaScript'in Datenesnesini kullanma (kitaplık yok):

# 1 için önceki cevabım yanlıştı (24 saat ekledi, gün ışığından yararlanma saatine ve gün ışığından geçiş sürelerini hesaba katmamak; Akıllı İnsan 7 Kasım 2010'da Doğu saat diliminde başarısız olacağını belirtti). Bunun yerine, Jigar'ın cevabı bunu bir kütüphane olmadan yapmanın doğru yoludur:

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

JavaScript tarih nesnesi, fareyle üzerine gelme konusunda akıllı olduğundan, bu ayın (veya yılın) son günü için bile geçerlidir:

(Bu cevap şu anda kabul ediliyor, bu yüzden silemiyorum. Kabul edilmeden önce OP'ye Jigar'ları kabul etmelerini önerdim, ancak belki de bunu listedeki # 2 veya # 3 öğeleri için kabul ettiler.)

2. MomentJS Kullanımı :

var today = moment();
var tomorrow = moment(today).add(1, 'days');

( addYeni bir örnek döndürmek yerine, çağırdığınız örneği değiştirdiğinize dikkat edin , bu nedenle today.add(1, 'days')değişiklik yapar today. Bu yüzden klonlama op ile başlıyoruz var tomorrow = ....)

3. DateJS kullanarak , ancak uzun zamandır güncellenmedi:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

Ama document.getElementById ("arrival_date") değerini kullanarak bir değişkende 2010-09-11 tarihim var, geçersiz tarih gösteriyor
Santanu

1
@santanu: Bu tamamen farklı bir sorun: Tarih ayrıştırma (bir dizeyi yorumlayarak tarih alma). Bu biçim statikse, kendiniz ayrıştırabilir ve sonuçları Dateyapıcıya ( new Date(year, month, date)) besleyebilirsiniz ; şartnamenin 15.9.2.1 bölümüne bakınız ; bir dizi formatı kabul etmek istiyorsanız, kesinlikle DateJS'e bakınız .
TJ Crowder

1
@santanu: Sadece yukarıdakileri takip etmek için: Bazı tarayıcılar bu formatı başarıyla ayrıştırabilir Date.parse(bu da daha sonra besleyebileceğiniz birkaç milisaniye döndürür new Date(ms)). Ancak dikkat, bu tarayıcıdan tarayıcıya değişebilir. Yakın zamana kadar uygulamalar, istedikleri her şeyi yapabilirdi Date.parse. Yeni 5. sürüm belirtimi artık kabul edilmesi gereken minimum bir biçime sahip, ancak henüz buna güvenmem.
TJ Crowder

Ben sadece bir Date örneğine bir saniye eklemek istedim; bu benim için çalıştı x = new Date(); x2 = new Date(x.getTime() + 1000), burada 1000 milisaniyelik bir artış.
berto

1
@piavgh: İlk çözümde yanlış bir şey yok, sadece onu nasıl kullanıyorsunuz. Datenesneler değiştirilebilir. Aynı Date nesneyi dizide üç kez saklıyorsunuz . Üç farklı Datenesne istiyorsanız, üç nesne oluşturmanız gerekir:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
TJ Crowder

178
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Ancak document.getElementById ("arrival_date") değerini kullanarak bir değişkende 2010-09-11 tarihim var, geçersiz tarih gösteriyor
Santanu

1
@sanatu: Bu durumda dizeyi tarayıcının kabul edeceği şekilde biçimlendirmeniz gerekir. Chrome kabul eder, new Date("2009-09-11")ancak Firefox kabul etmez. Bence çoğu tarayıcı new Date("2009/09/11")bu kadar kolay bir çözüm olabilir var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund

5
Değiştirilmesi daha bir daha sağlam bir yaklaşım -ile /ve tarayıcılar onu kabul edeceğini umarak bölüme dize bölmek olacaktır: var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1);Kullandığımız o Not m-1javascript ay numaralandırma değerleri (Ocak değil 1, 0 olmak üzere) çünkü burada ve d+1çünkü biz başlangıçtaki atamada zaten artımı yapıyorsunuz (29 Şubat vb. için otomatik olarak düzeltilecektir)
David Hedlund

35

Bu yanıttaki örneklerin hiçbiri Yaz Saati Uygulaması ayar günleri için geçerli görünmemektedir. O günlerde, gün içindeki saat sayısı 24 değildir ("ileri geri" veya "geri düşmeye" bağlı olarak 23 veya 25'tir).

Aşağıdaki AddDays javascript işlevi gün ışığından yararlanma süresini hesaplar:

function addDays(date, amount) {
  var tzOff = date.getTimezoneOffset() * 60 * 1000,
      t = date.getTime(),
      d = new Date(),
      tzOff2;

  t += (1000 * 60 * 60 * 24) * amount;
  d.setTime(t);

  tzOff2 = d.getTimezoneOffset() * 60 * 1000;
  if (tzOff != tzOff2) {
    var diff = tzOff2 - tzOff;
    t += diff;
    d.setTime(t);
  }

  return d;
}

İşte işlevi test etmek için kullandığım testler:

    var d = new Date(2010,10,7);
    var d2 = AddDays(d, 1);
    document.write(d.toString() + "<br />" + d2.toString());

    d = new Date(2010,10,8);
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, 1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

33

En kolay yol milisaniyeye dönüştürmek ve 1000 * 60 * 60 * 24 milisaniye eklemektir:

var tomorrow = new Date(today.getTime()+1000*60*60*24);

Bunu seviyorum, tamsayı temsil kuralı.
exebook

Bu en iyi cevap. İstenildiği kadar gün kolayca artırılabilir / azaltılabilir; sadece 1000*60*60*24x ile çarparakDaysToBeAdded
Khalil Khalaf

Veya, new Date(+new Date() + 1000*60*60*24)ama aslında getTime()/ ile gerçekten benzer setTime().
Polv

1
Tarihiniz UTC veya yaz saati uygulaması olmayan başka bir saat diliminde değilse bunu yapmayın. Aksi takdirde, yılda 2 gün boyunca beklenmedik sonuçlar verecektir.
ItalyPaleAle

A one-liner:new Date(Date.now()+1000*60*60*24);
aiyan

28

Yarın saf JS'de bir satırda ama çirkin !

new Date(new Date().setDate(new Date().getDate() + 1))

İşte sonuç:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)

14

Diğer kişilerin önerilerini takip etmeden önce dizenizi ayrıştırmanız gerekir:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Tekrar aynı formatta olmasını istiyorsanız, bunu "manuel olarak" yapmanız gerekir:

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

Ancak, diğer yanıtlarda belirtildiği gibi Date.js'yi almanızı öneririm, bu size çok yardımcı olacaktır .


7

Hiçbir şeyin bundan daha güvenli olmadığını hissediyorum, .getTime()ve .setTime()bu da en iyisi ve performansı olmalı.

const d = new Date()
console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS

.setDate() geçersiz Tarih (31 + 1 gibi) için çok tehlikelidir ve tarayıcı uygulamasına bağlıdır.


5

Önümüzdeki 5 gün:

var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();


for(i=0; i < 5; i++){
var curdate = new Date(y, m, d+i)
console.log(curdate)
}

Yukarıdaki cevapları denedim ama boşuna. Kodunuz bir cazibe gibi çalıştı. Teşekkürler!
dimmat

4

İki yöntem:

1:

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)

2: Önceki yönteme benzer

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)


2
 Date.prototype.AddDays = function (days) {
    days = parseInt(days, 10);
    return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
}

Misal

var dt = new Date();
console.log(dt.AddDays(-30));
console.log(dt.AddDays(-10));
console.log(dt.AddDays(-1));
console.log(dt.AddDays(0));
console.log(dt.AddDays(1));
console.log(dt.AddDays(10));
console.log(dt.AddDays(30));

Sonuç

2017-09-03T15:01:37.213Z
2017-09-23T15:01:37.213Z
2017-10-02T15:01:37.213Z
2017-10-03T15:01:37.213Z
2017-10-04T15:01:37.213Z
2017-10-13T15:01:37.213Z
2017-11-02T15:01:37.213Z

Kodunuz çalışmıyor. İlk console.log () ile denedim ve diyor ki: dt.AddDays () bir işlev değildir.
Adrian2895

1

Bunun bir HATA (Test edilmiş Firefox 32.0.3 ve Chrome 38.0.2125.101) olup olmadığından tam olarak emin değilim, ancak Brezilya'da (-3 GMT) aşağıdaki kod başarısız olacak:

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

$date = new Date(2014, 9, 16,0,1,1);
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");

Sonuç:

Fri Oct 17 2014 00:01:01 GMT-0300
Sat Oct 18 2014 00:01:01 GMT-0300
Sat Oct 18 2014 23:01:01 GMT-0300
Sun Oct 19 2014 23:01:01 GMT-0200

Tarihe bir Saat eklemek, mükemmel bir şekilde çalışmasını sağlayacaktır (ancak sorunu çözmez).

$date = new Date(2014, 9, 16,0,1,1);

Sonuç:

Fri Oct 17 2014 01:01:01 GMT-0300
Sat Oct 18 2014 01:01:01 GMT-0300
Sun Oct 19 2014 01:01:01 GMT-0200
Mon Oct 20 2014 01:01:01 GMT-0200

1

Yarının tarihinin dize olarak temsil edilmesiyle sonuçlanır. Bugünün tarihini almak, Date.getDate () ve Date.setDate () kullanarak bir gün eklemek ve Date nesnesini bir dizeye dönüştürmek için yeni Date () kullanın.

  const tomorrow = () => {
      let t = new Date();
      t.setDate(t.getDate() + 1);
      return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
        t.getDate()
      ).padStart(2, '0')}`;
    };
    tomorrow();

1

Vanilya js ile tarihin yılını artırma:

start_date_value = "01/01/2019"
var next_year = new Date(start_date_value);
next_year.setYear(next_year.getYear() + 1);
console.log(next_year.getYear()); //=> 2020

Birisinin tarih (gün) dışında bir değeri artırmak istemesi durumunda


1

Yerel JS aracılığıyla, bir gün eklemek için aşağıdakileri yapabilirsiniz:

let date = new Date(); // today
date.setDate(date.getDate() + 1) // tomorrow

Başka bir seçenek momentkitaplığı kullanmaktır :

const date = moment().add(14, "days").toDate()

1
Lütfen bu kodun ne yaptığını açıklayın. OP sorununun nasıl ele alındığı hakkında ayrıntılar ekleyin.
Yash

1

JavaScript tarihleri ​​için saat dilimi / yaz saati uygulaması farkında tarih artışı:

function nextDay(date) {
    const sign = v => (v < 0 ? -1 : +1);
    const result = new Date(date.getTime());
    result.setDate(result.getDate() + 1);
    const offset = result.getTimezoneOffset();
    return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.