回答:
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か月前の何曜日かを尋ねた場合です。
また、1か月は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からコピーして貼り付ける必要はありません。自分でコードを開発して、必要なことを正確に実行できます。
Moment.jsというライブラリを使用することをお勧めします。
十分にテストされており、ブラウザー間およびサーバー側で動作します(AngularプロジェクトとNodeプロジェクトの両方で使用しています)。ロケールの日付をサポートしています。
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')
変数に直接入れる「1つのライナー」(読みやすいように多くの行に)):
var oneMonthAgo = new Date(
new Date().getFullYear(),
new Date().getMonth() - 1,
new Date().getDate()
);
物事を本当に簡単にするために、JavaScriptの日付ライブラリであるDateJSを使用できます。
あなたのためのサンプルコード:
Date.today().add({ months: -1 });
これは、加算/減算を処理する必要があります。減算するには負の値を、加算するには正の値を入力するだけです。これにより、月のクロスオーバー問題も解決されます。
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;
}
setMonth
gilly3が提供する方法が探しているものと異なる場合は、次の点を考慮してください。
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".
任意の時間使用できます。適切な倍数を設定するだけです。
Date
クラスと同じくらい弱く、Date.jsが推奨されますが、少なくともカジュアルな使用に十分な寛大な前向きカレンダーをモデル化します。
setTime()
か?
私は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.');
これは、最小かつ最も簡単なコードです。
var minDate = new Date();
minDate.setMonth(minDate.getMonth() - 3);
現在の日付を持つ変数を宣言します。次に、setMonth組み込み関数を使用するだけで、3か月前の日付を取得できます。
私の場合、現在の日付から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)
JS Dateオブジェクトと、加算/減算する月数の整数を渡します。monthsToAdd
正または負にすることができます。JS日付オブジェクトを返します。
あなたの場合はoriginalDateObject
3月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);
};
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>