JavaScript'teki bir tarihten günleri çıkarma


603

Herkes bir tarih (örneğin Bugün) almak ve X gün geri gitmek için kolay bir yol biliyor mu?

Örneğin, bugünden 5 gün önce tarihi hesaplamak istersem.


4
Kabul edilen cevabı kullanırken problemler buldum. Görünüşe göre setDate () 'de negatif değerler kullanılması beklendiği gibi çalışmıyor. Başka (daha iyi?) Bir çözüm için stackoverflow.com/a/9037132/792287 adresine bakın .
vandiedakaf


Yanıtlar:


961

Bunun gibi bir şey deneyin:

 var d = new Date();
 d.setDate(d.getDate()-5);

Bunun tarih nesnesini değiştirdiğini ve güncellenen tarihin zaman değerini döndürdüğünü unutmayın.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());


9
Bunun çıktısı bana uzun bir tamsayı dizisi veriyor. 14.05.2012 olarak nasıl biçimlendirileceğine dair bir fikrin var mı?
user525146

162
Bunun google'ın üstünde olduğu göz önüne alındığında, yukarıdaki yoruma cevap vereceğimi anlıyorum: new Date(new Date().setDate(new Date().getDate()-5))- bu 5 gün önce olacak. Yanıt örneğinde, bir tarih nesnesi almak için yeni bir tarihe iletin. Yani new Date(d)ne istiyorsun.
Jesse

8
Bununla ilgili sorun, tarih için geçerli bir değer olmayan 00 ile sonuçlanabilmenizdir.
DominicM

24
setDate(-1)tarihi ayın son gününe ayarlayacak
Peter

5
@ user525146 sayının ne olduğunu değil, nasıl biçimlendirileceğini sordu. Yanıltıcı cevaplara gerek yok. Numara, Tarih kullanılması birini biçimlendirmek için toStringgibi yöntemlerle toISOString, toDateStringvb
Kötü Request

83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Web uygulamanız boyunca çok sayıda baş ağrılı tarih manipülasyonu gerçekleştiriyorsanız, DateJS hayatınızı daha kolay hale getirecektir:

http://simonwillison.net/2007/Dec/3/datejs/


23
bu bir uç durumdur, ancak bu gün ışığından yararlanma saatinin başlangıcı / sonu etrafında başarısız olabilir. 5 gün değil 5 * 24 saat çıkarıyorsunuz. yaz saati uygulamasının ilk günü sadece 23 saat, son gün ise 25 saattir. genellikle önemli değil, ama dikkate alınması gereken bir şey.
Kip

11
@Kip Yaz saatinden ve zaman dilimlerinden nefret ediyorum. Hepimiz GMT'ye taşınmalıyız.
cwallenpoole

6
@cwallenpoole kabarcıklarınızı patlatmamak için, ancak Greenwich'te bile DST kullanıyorlar. Eğer gerçekten GMT'de olmak istiyorsanız, İzlanda ve birkaç batı Afrika ülkesi ile sınırlısınız.
Kip

1
Bu yöntemin sorunu, yeni yıl
Daniel Williams

4
@danielWilliams Bu yeni yılla nasıl çalışmıyor? getTime()ve setTime()çağdan beri milisaniyedir. Sürenin bir yıl sınırını aşması önemli değil.
Mashmagar

52

Böyle bir şey gider:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);

Bunun çıktısı bana uzun bir tamsayı dizisi veriyor. 14.05.2012 olarak nasıl biçimlendirileceğine dair bir fikrin var mı?
user525146

7
D.setDate öğesinin dönüş değeri gerçekten bir tamsayı değeridir. Ancak, gerçekte "d" değeri değiştirildiği için, bu noktada dönüş değeri ile ilgilenmiyor olabilirsiniz. Asıl sorunuz şimdi setDate'in dönüş değeri değil, şimdi "d" de olan tarihinizi nasıl biçimlendireceğinizdir. (Eh, aslında dönüş değeri, ama o noktaya kadar bir tarih değil ve sizi karıştırmak istemiyorum - sadece d kullanın, daha hızlı olacak). Tarihleri ​​biçimlendirmek için d.getMonth (), d.getFullYear () ve d.getDate () yöntemlerini istiyorsunuz. Jan 0 olduğu için d.getMonth () öğesine bir tane eklemek istiyorsunuz.
Chris Nielsen

2
Basit bir yöntem olarak: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};o zaman sadecevar daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjak Tabii ki bu ayın sonunu / başlangıcını geçerseniz işe yarar. Neden işe yaramadı?
Chris Nielsen

23

GetDays + X'in gün / ay sınırları içinde çalışmadığını fark ettim. GetTime kullanımı, tarihiniz 1970'ten önce olmadığı sürece çalışır.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));

3
Ben de aynı şeyi fark ettim. Daha fazla şaşırmadım, yoksa bir şey mi kaçırıyorum?
Sean Glover

11
Bu yanlış, yeni Date (). SetDate (-1) önceki ayın son gününü verecektir.
zbrunson

2
Bu, gün ışığından yararlanma saatinin başlangıcı / sonu durumunda da yanlıştır. Yaklaşımınız her günün 24 saati olduğu varsayımıyla 7 * 24 saat çıkarılıyor. DST'nin ilk günü sadece 23 saat ve son günü 25 saattir. setDate (getDate () - 7) bu sorunla karşılaşmaz.
Kip

1
getTime evrensel zamanla çalışır. Böylece, Date nesnesinden 7 gün süre doğru çıkarılır. Belirttiğiniz saat dilimindeki bir dizeye dönüştürdüğünüzde, o bölgenin saatini doğru bir şekilde gösterir.
awjr

Zaman değişikliği gününde dikkatli olun. Sonbaharda geri düştüğümüzde, o günün 25 saati var, bu yüzden gece yarısından 24 saat çıkarılması aynı güne inecek. Ancak bu teknik (milisaniyeyi çıkararak), her operasyondan sonraki günü en yakın gece yarısına yuvarlarsanız çalışır. Bunu önce 12 saat ekleyip ardından saatleri sıfıra ayarlayarak yapabilirsiniz.
Magmatic

18

moment.js dosyasını edinin. Tüm havalı çocuklar kullanıyor. Daha fazla biçimlendirme seçeneği vb. Vardır.

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

İsteğe bağlı! Açısal ciltleme için JS Date nesnesine dönüştür.

var date = new Date(dateMnsFive.toISOString());

İsteğe bağlı! Biçim

var date = dateMnsFive.format("YYYY-MM-DD");

randevunuzu geçerek uyarılar almaya başlayacaksınız. Kullanımdan kaldırma uyarısı: sağlanan değer, tanınan bir RFC2822 veya ISO biçiminde değil. an yapı tüm tarayıcılarda ve sürümlerde güvenilir olmayan js Date () 'e geri döner. RFC2822 / ISO dışı tarih biçimleri önerilmez ve yakında çıkacak olan büyük sürümde kaldırılacaktır. Daha fazla bilgi için lütfen momentjs.com/guides/#/warnings/js-date adresine bakın .
Anahtarı

13

Date için bu prototipi, günleri çıkarmak için negatif değerler ve gün eklemek için pozitif değerler iletebilmem için yaptım.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

Yani, kullanmak için yazabilirim:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);

2
Gün eklemek ve çıkarmak için sırasıyla günler için d.setDate(d.getDate() + days)pozitif ve negatif değerlerle kullanabilirsiniz . Ve bir kopya oluşturup döndürmemek için örnek üzerinde çalışmalıdır (diğer Tarih yöntemleri gibi).
RobG

13

Mevcut çözümlerden birkaçı yakındı, ama tam olarak istediğim gibi değildi. Bu işlev hem pozitif hem de negatif değerlerle çalışır ve sınır durumlarını işler.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}

2
bu yöntemi mevcut ayın 15'ine 20 gün eklemek için kullanırsam önümüzdeki aya 'dökülür' mü? Öyle görünmüyor.
Bora

2
@Bora - evet, gerekirse ayı doğru bir şekilde artırır. Örneğin, 15 Ağustos'a 20 gün eklemek: addDays (yeni Tarih (2015, 07, 15), 20) "Cum Eyl 2015 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore

12

Matematiği milisaniye içinde yapmayı seviyorum. Öyleyse kullanDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

ve eğer biçimlendirilmiş isterseniz

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

NOT: Date.now()eski tarayıcılarda çalışmaz (örneğin IE8 sanırım). Burada çoklu doldurun .

GÜNCELLEME Haziran 2015

@socketpair özensizliğime dikkat çekti. Dediği gibi "Yılın bir günü 23 saat, saat 25'i saat dilimi kuralları nedeniyle".

Bunu genişletmek için, yukarıdaki cevap, 5 gün önce LOCAL gününü gün ışığından yararlanma değişiklikleri içeren bir saat diliminde hesaplamak istediğinizde gün ışığından yararlanma yanlışlıklarına sahip olacak ve

  • Date.now()Sana şu anki LOCAL zamanını verdiğini (yanlış) varsayalım veya
  • Kullanım .toString()nedenle yerel tarih döner ve uyumsuzdur Date.now()UTC temel tarih.

Ancak, matematiğinizi UTC'de gerçekleştiriyorsanız çalışır, ör.

A. UTC tarihini 5 gün önce NOW'dan (UTC) istiyorsunuz.

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B. "Şimdi" dışında bir UTC temel tarihiyle başlayarak Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString

3
Bu kesin değil. Yılda bir gün 23 saat, saat 25'e göre 25 saat vardır.
socketpair

Artık saniye olduğunda başarısızlık koşulları hakkında endişe ediyorum ... bu yüzden belki de kritik kod için iyi değil.
robocat

12

GetDate () / setDate () yöntemiyle ilgili bir sorun buldum, her şeyi milisaniyeye kolayca çeviriyor ve sözdizimi bazen benim için zor.

Bunun yerine, 1 gün = 86.400.000 milisaniye olduğunu düşünmeyi seviyorum.

Yani, sorunuz için:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Tıkır tıkır çalışıyor.

30/60/365 günlük hesaplamalar yapmak için bu yöntemi her zaman kullanıyorum.

Aylar, yıllar vb. İçin zaman birimleri oluşturmak üzere bunu kolayca tahmin edebilirsiniz.


11

tarihinizi parçalara ayırın, ardından ayarlanan değerlerle yeni bir Tarih döndürün

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

Ayların sıfır temelli olduğunu, ancak günlerin olmadığını unutmayın. yani yeni Tarih (2009, 1, 1) == 01 Şubat 2009, yeni Tarih (2009, 1, 0) == 31 Ocak 2009;


2
Örneğin bir tarihe bu şekilde 50 gün eklerseniz ne olur? Tarihi 68 Ağustos 2009 olarak ayarlayacak mı? Yoksa bunun her zaman uygun ay ve / veya yıla doğru şekilde sarıldığından emin misiniz?
Jesper

Date.prototype öğesine addDays, addMonths ve addYears eklemek için kullanılır. Güzel ve basit.
Scott Isaacs

1
Bu doğru cevap olmalıdır - kabul edilen cevabın başarısız olduğu yılın son gününde bile çalışır.
kris

1'den 99'a kadar olan tarihler için çalışmaz. ;-) Sadece get * ve set * yöntemlerini kullanmak çok daha iyi .
RobG

8

İkinci değişkeni kullanmadan, 7 değerini arka x günlerinizle değiştirebilirsiniz:

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

5

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);


2

Tarih manipülasyonu için bir fonksiyon yarattım. istediğiniz sayıda gün, saat, dakika ekleyebilir veya çıkarabilirsiniz.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

Şimdi, parametreleri ileterek bu işlevi çağırın. Örneğin, bugünden 3 gün öncesine tarih almak için bir işlev çağrısı.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");

2

MomentJS kullanın .

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


1

En iyi yanıtlar, kodumda ayın ilkinde geçerli ayın gelecekteki bir tarihini belirleyecek bir hataya yol açtı. İşte yaptığım şey,

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time


0

Aşağıdakileri seviyorum çünkü tek satır. DST değişiklikleri ile mükemmel değil ama genellikle benim ihtiyaçları için yeterli.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));

0

benim için tüm kombinasyonlar aşağıdaki kod snipleti ile iyi çalıştı, snippet Angular-2 uygulaması için, eğer gün eklemeniz gerekiyorsa, pozitif numberofDays'i geçmeniz gerekiyorsa, negatif numberofDays'ı geçmeniz gerekiyorsa

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}

0

Date.js dışında iyi kilometre performansı elde ederim:

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

Güzel!

Web sitesi bu güzelliği içerir:

Datejs sadece dizeleri ayrıştırmakla kalmıyor, aynı zamanda


0

Hem birkaç günü çıkarmak hem de tarihinizi insan tarafından okunabilir bir biçimde biçimlendirmek istiyorsanız DateHelper, şuna benzer bir özel nesne oluşturmayı düşünmelisiniz :

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

(ayrıca bu Fiddle'a bakın )


0

Aşağıdaki koda bakın, günleri geçerli tarihten çıkarın. Ayrıca, ayı çıkarılan tarihe göre ayarlayın.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);

-1

Tarihi ayarlarken, tarih milisaniyeye dönüştürülür, bu nedenle tarihi bir tarihe dönüştürmeniz gerekir:

Bu yöntem de, yeni yıl değişikliği vb.

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

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );

-1

Javascript'i kullanabilirsiniz.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

PHP için,

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

Umarım size yardımcı olur.


-1

Milisaniyeye dönüştüm ve ay ve yıl değişmez ve mantıklı değil

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

Umut yardımcı olur


-1

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );


1
Bazı insanlar ne yaptığınızı alamayabileceğinden, kodunuzu / cevabınızı her zaman yorumlamalısınız
Michael

-1

Modern JavaScript işlevinin söz dizimini kullanma

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday


-1

Böyle bir şey dene

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate herhangi bir tarih olabilir

limit gün sayısındaki fark olabilir (gelecek için pozitif ve geçmiş için negatif)


-1

Bu size son 10 gün sonucunu verecek% 110 çalışma herhangi bir sorun almayacaksınız

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

çıkarma günlerini ihtiyaçlarınıza göre değiştirebilirsiniz


-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;

-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

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.