JavaScriptで日付から日数を引く


603

誰かが日付(例:今日)を取り、X日間戻る簡単な方法を知っていますか?

たとえば、今日の5日前の日付を計算する場合などです。


4
承認された回答を使用して問題が見つかりました。setDate()で負の値を使用すると、期待どおりに機能しないようです。別の(より良い)ソリューションについては、stackoverflow.com / a / 9037132/792287を参照してください。
vandiedakaf 2013


回答:


962

次のようなものを試してください:

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

これは日付オブジェクトを変更し、更新された日付の時刻値を返すことに注意してください。

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
その出力では、整数の長い文字列が得られます。それを2012年5月14日にフォーマットする方法のアイデアはありますか?
user525146 2012年

162
これがグーグルのトップにあることを考えると、私は上記のコメントに答えると思います:new Date(new Date().setDate(new Date().getDate()-5))-それは5日前です。答えの例では、それを新しい日付に渡して日付オブジェクトを取得します。だからnew Date(d)あなたが欲しいものです。
ジェシー

8
この問題は、日付の有効な値ではない00になる可能性があることです。
DominicM 2013

24
setDate(-1)日付を月の最終日に設定します
Peter

5
@ user525146は、数値が何であるかではなく、数値をフォーマットする方法を尋ねました。降順の答えは必要ありません。番号、日付の使用1フォーマットするtoStringなどの方法toISOStringtoDateStringなど、
不正な要求を

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

Webアプリケーション全体で大量の日付の操作を実行している場合、DateJSを使用すると作業がはるかに簡単になります。

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


23
これはエッジケースですが、夏時間の開始/終了時に失敗する可能性があります。5日を減算するのではなく、5 * 24時間を減算します。夏時間の最初の日は23時間だけで、最後の日は25時間です。通常は問題ではありませんが、考慮する必要があります。
キップ2008

11
@Kip私は夏時間を嫌います...そしてタイムゾーン。私たちはみなGMTに移行する必要があります。
cwallenpoole 2015

6
@cwallenpooleはバブルを破裂させませんが、グリニッジでもDSTを使用します。したがって、本当にGMTになりたい場合は、アイスランドといくつかの西アフリカ諸国に制限されます。
2015年

1
この方法の問題点は、それが新しい年などでは動作しないということです
ダニエル・ウィリアムズ

4
@danielWilliamsこれは新しい年ではうまくいきませんか?getTime()そしてsetTime()エポックからのミリ秒です。時間が年の境界を越えても問題はありません。
マシュマガル

52

それはこのようなものになります:

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

その出力では、整数の長い文字列が得られます。それを2012年5月14日にフォーマットする方法のアイデアはありますか?
user525146 2012年

7
d.setDateの戻り値は実際には整数値です。ただし、「d」の実際の値は変更されているため、この時点では実際には戻り値に関心がない可能性があります。あなたの本当の質問は今あなたの日付をどのようにフォーマットするかであり、それは現在「d」にあり、setDateの戻り値ではありません。(まあ、それは実際には戻り値ですが、それはその時点までの日付ではなく、私はあなたを混乱させたくありません-dを使用するだけで、より速くなります)。日付をフォーマットするには、d.getMonth()、d.getFullYear()、およびd.getDate()メソッドが必要です。月は0であるので、あなたは、d.getMonth()に1を追加したい
クリス・ニールセン

2
簡単な方法としては:function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};その後、ちょうどvar daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjakもちろん、これは月末/初めを超えた場合に機能します。なぜうまくいかないのですか?
Chris Nielsen

23

getDays + Xが日/月の境界を超えて機能しないことに気づきました。getTimeの使用は、日付が1970より前でない限り機能します。

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

3
私も同じことに気づきました。もっと驚いていないか、何か不足していますか?
Sean Glover

11
これは不正解です。新しいDate()。setDate(-1)は前月の最終日を示します。
zbrunson 2014

2
これは、夏時間の開始/終了のエッジケースでも正しくありません。あなたのアプローチは、毎日24時間と仮定して、7 * 24時間を差し引いています。DSTの最初の日は23時間だけで、最後の日は25時間です。setDate(getDate()-7)にはこの問題はありません。
Kip

1
getTimeは世界時で機能します。したがって、Dateオブジェクトから7日間の時間を正しく減算します。指定したタイムゾーンの文字列に変換すると、そのゾーンの時刻が正しく表示されます。
awjr 2015年

時刻変更当日はご注意ください。秋にフォールバックすると、その日は25時間なので、真夜中から24時間を引くと同じ日に着陸します。しかし、この手法(ミリ秒を差し引く)は、すべての操作の翌日に真夜中に丸める場合に機能します。最初に12時間を追加し、次に時間をゼロに設定することでそれを行うことができます。
マグマティック、2017

18

moment.jsを取得します。すべてのクールな子供たちはそれを使用しています。より多くのフォーマットオプションなどがあります。

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

オプション!AngularバインディングのJS Date objに変換します。

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

オプション!フォーマット

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

日付を瞬間に渡すと、警告が表示され始めます。非推奨の警告:提供された値は、認識されているRFC2822またはISO形式ではありません。モーメントの構築はjs Date()にフォールバックします。これは、すべてのブラウザーとバージョンで信頼できるわけではありません。RFC2822 / ISO以外の日付形式は推奨されておらず、次のメジャーリリースで削除される予定です。詳細については、momentjs.com / guides /#/ warnings / js-dateを参照してください。
切り替え

13

Dateのこのプロトタイプを作成して、負の値を渡して日を減算し、正の値を渡して日を追加できるようにしました。

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;
    };
}

だから、それを使うために私は単に書くことができます:

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

2
日のd.setDate(d.getDate() + days)正の値と負の値の両方を使用して、それぞれ日数を加算および減算できます。また、(他のDateメソッドと同様に)インスタンスで機能し、コピーを作成して返す必要はありません。
RobG 2018

13

既存のソリューションのいくつかは近いものでしたが、私が望んでいたものとまったく同じではありませんでした。この関数は、正または負の値の両方で機能し、境界ケースを処理します。

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

2
この方法を使用して当月の15日に20日を追加した場合、翌月に波及しますか?ないようです。
Bora

2
@Bora-​​はい、必要に応じて月を正しく増分します。たとえば、8月15日に20日を追加すると、addDays(new Date(2015、07、15)、20)は「Fri Sep 04 2015 00:00:00 GMT-0700(PDT)」を返します
Joel Fillmore

12

計算はミリ秒単位で行うのが好きです。だから使うDate.now()

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

そしてそれが好きならフォーマット

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

注:Date.now()古いブラウザ(IE8など)では機能しません。ここにポリフィル

2015年6月更新

@socketpairは私のだらしさを指摘しました。彼/彼女が言うように「年のいくつかの日は23時間、そしてタイムゾーンのルールのためにいくつかの25」を持っています。

さらに詳しく説明すると、夏時間の変更があるタイムゾーンで5日前のLOCAL日を計算する場合、上記の回答では夏時間の誤差が生じます。

  • (間違って)Date.now()現在のローカルの現在の時刻を与えると仮定する、または
  • .toString()ローカル日付を返すためDate.now()、UTCの基準日と互換性がない使用。

ただし、すべてUTCで計算している場合は機能します。たとえば、

A. 5日前のUTC日付をNOW(UTC)から取得したい

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.「今」以外のUTC基準日から開始し、 Date.UTC()

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

3
これは正確ではありません。1年のうちの23日の時間と、タイムゾーンルールにより25日の時間があります。
ソケットペア、

うるう秒があると失敗状態になるのではないかと心配になります。
robocat 2015

12

getDate()/ setDate()メソッドの問題は、簡単にすべてをミリ秒に変換しすぎることであり、構文を理解するのが難しい場合があります。

代わりに、1日= 86,400,000ミリ秒という事実を回避したいと思います。

それで、あなたの特定の質問のために:

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

魅力のように機能します。

私はローリング30/60/365日の計算を行うためにこの方法をいつも使用しています。

これを簡単に外挿して、月、年などの時間の単位を作成できます。


11

日付を部分に分割し、調整された値で新しい日付を返します

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);
}

月はゼロベースですが、日はそうではないことに注意してください。つまり、新しい日付(2009、1、1)== 2009年2月1日、新しい日付(2009、1、0)== 2009年1月31日。


2
たとえば、この方法で日付に50日を追加するとどうなりますか?日付は2009年8月68日に設定されますか?それとも、これは常に適切な月または年、あるいはその両方に正しく折り返されますか?
Jesper、

これを使用して、addDays、addMonths、およびaddYearsをDate.prototypeに追加します。素敵でシンプル。
スコットアイザックス2013年

1
これは正しい答えであるはずです-受け入れられた答えが失敗した年の最後の日でも機能します。
kris

年が1から99の日付では機能しません。;-) get *メソッドとset *メソッドを使用するだけの方がはるかに優れています。
RobG 2018

8

2番目の変数を使用せずに、7をback x日で置き換えることができます。

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

日付操作のための関数を作成しました。日、時間、分をいくつでも加算または減算できます。

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;
 }

次に、パラメーターを渡してこの関数を呼び出します。たとえば、今日から3日前の日付を取得するための関数呼び出しを次に示します。

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

2

MomentJSを使用します

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

上位の回答により、コードにバグが発生し、月の最初に現在の月の将来の日付が設定されました。これが私がしたことです、

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

1行なので以下が好きです。DSTの変更については完璧ではありませんが、通常は私のニーズには十分です。

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

0

私にとって、すべての組み合わせは以下のコードのスニペットでうまく機能しました、スニペットはAngular-2実装用です、日を追加する必要がある場合は正のnumberofDaysを渡し、減算する必要がある場合は負のnumberofDaysを渡します

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から良い走行距離を得ます:

http://www.datejs.com/

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

いいね!

ウェブサイトにはこの美しさが含まれています:

Datejsは文字列を解析するだけでなく、文字列を2つにきれいにスライスします


0

日数の減算と人間が読める形式の日付の両方をフォーマットする場合はDateHelper、次のようなカスタムオブジェクトの作成を検討する必要があります。

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));

このフィドルも参照してください)


0

次のコードを参照して、現在の日付から日数を引きます。また、差し引いた日付で月を設定します。

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

日付を設定すると、日付はミリ秒に変換されるため、日付に戻す必要があります。

この方法も考慮に入れ、新年の変更など。

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を使用できます。

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の場合、

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

それがあなたを助けることを願っています。


-1

私はミリ秒に変換し、それ以外の日を差し引いた月と年は変更されず、論理的ではありません

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();

願ってる


-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
一部の人々はあなたがやっていることを理解できないかもしれないので、常にコード/回答にコメントする必要があります
Michael

-1

最新のJavaScript関数構文の使用

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

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


-1

このようなものを試してください

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

currDateは任意の日付にすることができます

制限は、日数の差である可能性があります(将来は正、過去は負)


-1

これにより、過去10日間の結果が110%機能し、問題は発生しません。

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;

あなたはあなたの要件に応じて減算日を変更することができます



-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());

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.