JavaScriptの日付から分を減算するにはどうすればよいですか?


133

この疑似コードを有効なjsに変換するにはどうすればよいですか[有効なJavaScriptの日付であることを除いて、終了日がどこから来るのか心配しないでください]

var myEndDateTime = somedate;  //somedate is a valid js date  
var durationInMinutes = 100; //this can be any number of minutes from 1-7200 (5 days)

//this is the calculation I don't know how to do
var myStartDate = somedate - durationInMuntes;

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

回答:


199

これを知ったら:

  • 1970年1月1日からのミリ秒でコンストラクターDate呼び出すことにより、を作成できます。
  • valueOf()AはDate1970年1月1日からのミリ秒数です
  • 60,0001分はミリ秒です:-]

...それほど難しいことではありません。

以下のコードでは、Dateから適切なミリ秒数を減算することにより、新しいが作成されますmyEndDateTime

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);

6
ただし、分を追加した場合は処理されません。分を追加するときに正しく処理するには、を使用する必要があります.getTime()。例:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
ガブリエルL.オリベイラ

var myStartDate = somedate.addMinutes(-durationInMuntes);somedateがDateオブジェクトであると想定して使用することもでき ます
kubahaha

1
それは動作します...しかし、Date()コンストラクターには3つのオプションがあるという質問があります。つまり、1:空の2:文字列と3:数値の年、数値の月....したがって、上記で使用されているものはどのコンストラクターに従いますか?
Zafar 2017年


これがうまくいかない例として、ヨーロッパ/ロンドンをタイムゾーンロケールとして使用すると、次のvar d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);ようeになり02:10:00ます。いいえ。01:10:00。DSTさん、こんにちは。そして、うるう秒があります...
Niet the Dark Absol 2017年

81

getおよびset minutesを使用してそれを達成することもできます。

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);

52
setMinutes()マイナスの分を正しく処理するのに十分スマートであることは注目に値します。その場合は、開始日は3時05分だった、とあなたが渡しているはずだ、30分を減算したい-25ことが知っているスマート十分ですsetMinutes()、に3:-25あります2:35。(つまり、例外をスローしません。)
Kip

2
@キップ-ありがとう、それはこの答えを価値のあるものにする洞察です。しかし、すべてのブラウザがこれを保証していますか?MDNは0-59のみが許可されていると言っているので私は尋ねますが、この場合、ドキュメントが間違っていると思いますか?参照:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
ジャスティン・エティエ

これは私にとってより便利でした。コンストラクタを介して特定の方法で設定された既存のDateオブジェクトインスタンスから時間を減算したかったのです。ありがとうございました!
Bill Effin Murray、2012

1
その.setMinutes(...)力はint値を処理することを覚えておいてください。あなた1.5 minutesがa Dateに設定した場合、それは設定され1 minute、秒を以前と同じに保ちます。
ガブリエルL.オリベイラ2016年

同様の使用例で、startDate = endDateを試したところ、間違った値が返されました。浅いコピーが発生する問題のように見えます
raghav710

35

すべてが目盛りであり、メソッドを記憶する必要はありません ...

var aMinuteAgo = new Date( Date.now() - 1000 * 60 );

または

var aMinuteLess = new Date( someDate.getTime() - 1000 * 60 );

更新

momentjsを使用した後、これはチェックすべき素晴らしいライブラリだと言わざるを得ません。ティックは多くの場合機能し、コードを非常に小さくすることは事実です。必要なことを行うために、コードをできるだけ小さくする必要があります。しかし、複雑なものについては、momentjsを使用してください。


2
IMOこれはそれほど単純ではありません。このコードが実際に行うことを解読するには、多少の努力が必要です。より良いアプローチは、そのようなロジックを関数にラップすることです。
sszarek 2017

12

moment.jsには、日付オブジェクトを操作する便利なメソッドがいくつかあります

.subtract方法は、あなたが量とTIMEUNIT文字列を提供することで、日付から時間単位の一定額を差し引くことができます。

var now = new Date();
// Sun Jan 22 2017 17:12:18 GMT+0200 ...
var olderDate = moment(now).subtract(3, 'minutes').toDate();
// Sun Jan 22 2017 17:09:18 GMT+0200 ...

6

これは私が見つけたものです:

//First, start with a particular time
var date = new Date();

//Add two hours
var dd = date.setHours(date.getHours() + 2);

//Go back 3 days
var dd = date.setDate(date.getDate() - 3);

//One minute ago...
var dd = date.setMinutes(date.getMinutes() - 1);

//Display the date:
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var date = new Date(dd);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var displayDate = monthNames[monthIndex] + ' ' + day + ', ' + year;
alert('Date is now: ' + displayDate);

出典:

http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-time/

https://stackoverflow.com/a/12798270/1873386


5
var date=new Date();

//here I am using "-30" to subtract 30 minutes from the current time.
var minute=date.setMinutes(date.getMinutes()-30); 

console.log(minute) //it will print the time and date according to the above condition in Unix-timestamp format.

を使用して、Unixタイムスタンプを従来の時間に変換できます。new Date()たとえば、

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.

書式を変更しました。投稿したい内容が反映されていることを確認してください。
adiga

1

以下のように試してください:

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);

0

これは私がやったことです:Codepenを参照してください

var somedate = 1473888180593;
var myStartDate;
//var myStartDate = somedate - durationInMuntes;

myStartDate = new Date(dateAfterSubtracted('minutes', 100));

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

function dateAfterSubtracted(range, amount){
    var now = new Date();
    if(range === 'years'){
        return now.setDate(now.getYear() - amount);
    }
    if(range === 'months'){
        return now.setDate(now.getMonth() - amount);
    }
    if(range === 'days'){
        return now.setDate(now.getDate() - amount);
    }
    if(range === 'hours'){
        return now.setDate(now.getHours() - amount);
    }
    if(range === 'minutes'){
        return now.setDate(now.getMinutes() - amount);
    }
    else {
        return null;
    }
}

OPはを使用しませんnew Date()が、指定された日付があり、分を引くことについてのみ尋ねました。また、コードは機能しません-Dateオブジェクトの代わりにUNIXタイムスタンプを返します。
のMichałPerłakowski

0

この関数でDateクラスを拡張する

// Add (or substract if value is negative) the value, expresed in timeUnit
// to the date and return the new date.
Date.dateAdd = function(currentDate, value, timeUnit) {

    timeUnit = timeUnit.toLowerCase();
    var multiplyBy = { w:604800000,
                     d:86400000,
                     h:3600000,
                     m:60000,
                     s:1000 };
    var updatedDate = new Date(currentDate.getTime() + multiplyBy[timeUnit] * value);

    return updatedDate;
};

そのため、任意の日付に分、秒、時間、日などの数を加算または減算できます。

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.