今日の3か月前にJavaScriptで日付を計算するにはどうすればよいですか?


147

現在の日付の3か月前の日付を作成しようとしています。以下のコードで今月を取得します

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

Date月が1月(1)である場合、日付の3か月前が10月(10)であることを考慮して、日付(データ型のオブジェクト)を計算および形成するロジックを提供できますか?

回答:


323
var d = new Date();
d.setMonth(d.getMonth() - 3);

これは1月に有効です。このスニペットを実行します。

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());


いくつかの注意点があります...

1か月は興味深いものです。1か月をどのように定義しますか?30日?ほとんどの人は、1か月前は前月の同じ日に必要な引用を意味すると言います。しかし、半分以上の時間、つまり30日ではなく31日前です。今日が月の31日である場合(8月でも12月でもない場合)、その日は前の月には存在しません。

興味深いことに、GoogleがJavaScriptに同意するのは、次の日の1か月前の何曜日かを尋ねた場合です。

「3月31日の1か月前」のGoogle検索結果に「3月3日」と表示される

また、1か月は30.4167日と表示されます。 「1か月後」のGoogle検索結果に「30.4167」と表示される

では、3月31日の1か月前と、3日前の3月28日の1か月前は同じですか これはすべて、「1か月前」の意味によって異なります。製品の所有者と会話してください。

momentjsのように実行し、月の最後の日に移動してこれらの月の最終日のエラーを修正したい場合は、次のようにすることができます。

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

要件がそれよりも複雑な場合は、数学を使用してコードを記述します。あなたは開発者です!ライブラリをインストールする必要はありません!Stackoverflowからコピーして貼り付ける必要はありません。自分でコードを開発して、必要なことを正確に実行できます。


var currentDate = new Date(); var currentMonth = currentDate.getMonth()-12; var pastDate = new Date(2011、currentMonth、01); alert(pastDate); これは機能し、12か月後にチェックされました
KeenUser

これは病気の答えです...どこから2012,0,15を取得しますか?既存の月を-1に変換しますか?
Alex G

3
@AlexG-JavaScriptの日付解析に慣れていない場合、私の簡単な例がどのように混乱するかがわかります。JavaScriptは月をゼロベースとして表現し、1月はゼロです。このような混乱を避けるために、特にそれが質問や私の回答とは関係がないため、デモを更新して、文字列から日付を取得しました。
gilly3 2015

7
私はこれが古いことを知っていますが、日付が3月31日で、この方法を使用して1か月を減算すると、結果は3月2日になります。 jsfiddle.net/atamata/rvumf7dg
atamata

@atamata-ええ、それは奇妙ですが、予測可能で期待されています。3月の前月末から31日は3月31日ですが、2月は3月2日です。月末から数える場合は、そのためのカスタムコードを記述する必要があります。
gilly3 2017年

28

Moment.jsというライブラリを使用することをお勧めします。

十分にテストされており、ブラウザー間およびサーバー側で動作します(AngularプロジェクトとNodeプロジェクトの両方で使用しています)。ロケールの日付をサポートしています。

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format()ISO 8601形式でフォーマットされた日付の文字列表現を返します。次のようなカスタム日付形式で使用することもできます。.format('dddd, MMMM Do YYYY, h:mm:ss a')


10

変数に直接入れる「1つのライナー」(読みやすいように多くの行に)):

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);

いいね!すべてのシナリオに適用できるかどうかはわかりませんが、十分に機能するようです。
デヴィンフィールズ

8

物事を本当に簡単にするために、JavaScriptの日付ライブラリであるDateJSを使用できます。

http://www.datejs.com/

あなたのためのサンプルコード:

Date.today().add({ months: -1 });

8

これは、加算/減算を処理する必要があります。減算するには負の値を、加算するには正の値を入力するだけです。これにより、月のクロスオーバー問題も解決されます。

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}

6

setMonthgilly3が提供する方法が探しているものと異なる場合は、次の点を考慮してください。

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

任意の時間使用できます。適切な倍数を設定するだけです。


私はgilly3の答えで行きます。あなたは毎月固定秒数を想定しています。JavaScriptのゆるい日付計算は、その日を正しく保ちます。9月28日前の3ヶ月は、7月28日でなければなりません
レイTOAL

1
JavaScriptは3月31日から1か月を引いたものをどのように計算するのでしょうか。
Niet the Dark Absol

1
その場合、2月31日が寛大なモードであるため、3月3日(2011年)を取得します。ただし、2か月を引くと、1月31日になります。1か月あたり28日間のモデルでは、そうなりません。Dateクラスと同じくらい弱く、Date.jsが推奨されますが、少なくともカジュアルな使用に十分な寛大な前向きカレンダーをモデル化します。
Ray Toal

あなたは正しく数千秒に数秒するべきではありませんsetTime()か?
Vlad Tsepelev

4

私はgilly3のシンプルな回答が好きですが、ユーザーはおそらく3月31日の前の月が3月3日になっていることに驚かれることでしょう。うるう年でない場合、31はすべて2月28日になります。

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');


2

エレガントな答えはもうありますが、読みにくいので自分で機能を作りました。私の目的では、否定的な結果は必要ありませんでしたが、変更するのは難しくありません。

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }

2

var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());


1

これは、最小かつ最も簡単なコードです。

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

現在の日付を持つ変数を宣言します。次に、setMonth組み込み関数を使用するだけで、3か月前の日付を取得できます。


-1

私の場合、現在の日付から1か月差し引く必要がありました。重要な部分は月の番号だったので、今月の何曜日にいるかは関係ありません。先月必要でした。これは私のコードです:

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

1か月を実際の日付から引くと正確ではありません。そのため、最初は月の最初の日を設定し(任意の月の最初の日は常に最初の日です)、2番目の場所は1日を引くので、常に先月に送信されます。あなたが男を助けることを願っています。

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)


-1

   

 var date=document.getElementById("date");
    var d = new Date();
   document.write(d + "<br/>");
    d.setMonth(d.getMonth() - 6);
    document.write(d);

 if(d<date)
  document.write("lesser then 6 months");
else
  document.write("greater then 6 months");


-1

JS Dateオブジェクトと、加算/減算する月数の整数を渡します。monthsToAdd正または負にすることができます。JS日付オブジェクトを返します。

あなたの場合はoriginalDateObject3月31日で、あなたは合格-1のようにmonthsToAdd、そしてあなたの出力日は2月28日になります。

多数の月(たとえば36か月)を経過すると、年の調整も適切に処理されます。

const addMonthsToDate = (originalDateObject, monthsToAdd) => {
  const originalDay = originalDateObject.getUTCDate();
  const originalMonth = originalDateObject.getUTCMonth();
  const originalYear = originalDateObject.getUTCFullYear();

  const monthDayCountMap = {
    "0": 31,
    "1": 28,
    "2": 31,
    "3": 30,
    "4": 31,
    "5": 30,
    "6": 31,
    "7": 31,
    "8": 30,
    "9": 31,
    "10": 30,
    "11": 31
  };

  let newMonth;
  if (newMonth > -1) {
    newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
  } else {
    const delta = (monthsToAdd * -1) % 12;
    newMonth = originalMonth - delta < 0 ? (12+originalMonth) - delta : originalMonth - delta;
  }

  let newDay;

  if (originalDay > monthDayCountMap[newMonth]) {
    newDay = monthDayCountMap[newMonth].toString();
  } else {
    newDay = originalDay.toString();
  }

  newMonth = (+newMonth + 1).toString();

  if (newMonth.length === 1) {
    newMonth = '0' + newMonth;
  }

  if (newDay.length === 1) {
    newDay = '0' + newDay;
  }

  if (monthsToAdd <= 0) {
    monthsToAdd -= 11;
  }

  let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;

  let newTime = originalDateObject.toISOString().slice(10, 24);

  const newDateISOString = `${newYear}-${newMonth}-${newDay}${newTime}`;

  return new Date(newDateISOString);
};

-5
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:

   <!DOCTYPE html>
<html>
<body>

<p>Click the button to display the date after changing the month.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {

var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);

OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate()  )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);

}

    document.getElementById("demo").innerHTML = d;
}
</script>

</body>
</html>

この回答は、すでに存在する他の7つのかなり古い回答とどう違うのですか?
Stephen Rauch 2017年

-5

var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);

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