Wie subtrahiere ich Minuten von einem Datum in Javascript?

132

Wie kann ich diesen Pseudocode in funktionierende js übersetzen [mach dir keine Sorgen darüber, woher das Enddatum kommt, außer dass es ein gültiges Javascript-Datum ist].

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

Antworten:

199

Sobald Sie dies wissen:

  • Sie können eine erstellen, Dateindem Sie den Konstruktor seit dem 1. Januar 1970 mit Millisekunden aufrufen .
  • Das valueOf()a Dateist die Anzahl der Millisekunden seit dem 1. Januar 1970
  • Es gibt 60,000Millisekunden in einer Minute: -]

... es ist nicht so schwer.

Im folgenden Code wird eine neue Dateerstellt, indem die entsprechende Anzahl von Millisekunden subtrahiert wird von myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);
Daniel LeCheminant
quelle
6
Funktioniert aber nicht, wenn Sie Minuten hinzufügen. Um richtig zu behandeln, wenn Sie Minuten hinzufügen, sollten Sie verwenden .getTime(). Beispiel:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira
Sie können auch verwenden var myStartDate = somedate.addMinutes(-durationInMuntes);Ich nehme an, irgendwann ist ein
Datumsobjekt
1
Es funktioniert ... aber Sie haben die Frage, ob der Date () -Konstruktor 3 Optionen hat, dh 1: leer 2: Zeichenfolge und 3: Zahlenjahr, Zahlenmonat ... also folgt der oben verwendete Konstruktor welchem ​​Konstruktor?
Zafar
3
Weitere Falschheitsprogrammierer glauben an die Zeit. # 32 "Jede Minute hat 60 Sekunden."
Niet the Dark Absol
Ein Beispiel dafür , wie dieser schief gehen, Europe / London als die Zeitzone locale verwenden: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);Sie erwarten ezu sein 02:10:00, nicht wahr? Nee. 01:10:00. Die Sommerzeit sagt Hallo. Und dann gibt es
Schaltsekunden
80

Sie können auch get und set Protokoll verwenden, um dies zu erreichen:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);
Miquel
quelle
51
Es ist erwähnenswert, dass dies setMinutes()klug genug ist, um negative Minuten korrekt zu behandeln. Also , wenn Starttermin war 3.05, und Sie möchten 30 Minuten subtrahieren, Sie nebenbei würde -25zu setMinutes (), die intelligent genug , um zu wissen , dass 3:-25ist 2:35. (dh es wirft keine Ausnahme.)
Kip
2
@Kip - Danke, das ist die Erkenntnis, die diese Antwort lohnenswert macht. Aber garantieren alle Browser dies? Ich frage, weil MDN sagt, dass nur 0 - 59 erlaubt sind - aber ich vermute, dass die Dokumente in diesem Fall einfach falsch sind? Siehe: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier
Dies war für mich nützlicher. Ich wollte die Zeit von einer vorhandenen Date-Objektinstanz subtrahieren, die auf bestimmte Weise über den Konstruktor eingerichtet wurde. Danke dir!
Bill Effin Murray
1
Denken Sie daran, dass .setMinutes(...)Force-Handle- intWerte. Wenn Sie setzen 1.5 minutesin eine Datewird es nur dann gesetzt 1 minuteund halten Sie die Sekunden , um die gleiche wie zuvor.
Gabriel L. Oliveira
Ich habe in einem ähnlichen Anwendungsfall falsche Werte erhalten, als ich startDate = endDate ausprobiert habe. Sieht aus wie das Problem, wo eine flache Kopie passiert
raghav710
35

Alles ist nur Zecken, keine Notwendigkeit, Methoden auswendig zu lernen ...

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

oder

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

aktualisieren

Nachdem ich mit momentjs gearbeitet habe, muss ich sagen, dass dies eine erstaunliche Bibliothek ist, die Sie sich ansehen sollten. Es ist wahr, dass Häkchen in vielen Fällen funktionieren und Ihren Code sehr klein machen, und Sie sollten versuchen, Ihren Code so klein wie möglich für das zu machen, was Sie tun müssen. Verwenden Sie für alles, was kompliziert ist, momentjs.

Jason Sebring
quelle
2
IMO ist das nicht so einfach. Es erfordert einige Anstrengungen, um zu entschlüsseln, was dieser Code tatsächlich tut. Der bessere Ansatz besteht darin, diese Art von Logik in eine Funktion zu packen.
sszarek
12

moment.js bietet einige wirklich nützliche Methoden zum Bearbeiten von Datumsobjekten

Mit der .subtract- Methode können Sie eine bestimmte Anzahl von Zeiteinheiten von einem Datum subtrahieren, indem Sie die Anzahl und eine Zeiteinheitszeichenfolge angeben.

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 ...
svarog
quelle
6

Folgendes habe ich gefunden:

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

Quellen:

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

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

Crashwap
quelle
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.

Sie können den Unix-Zeitstempel new Date()beispielsweise mithilfe von. in konventionelle Zeit konvertieren

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.
Rajesh Vinay Kumar
quelle
Ich habe einige Formatierungsänderungen vorgenommen. Bitte stellen Sie sicher, dass es immer noch das widerspiegelt, was Sie veröffentlichen möchten.
Adiga
1

Versuchen Sie es wie folgt:

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

Folgendes habe ich getan: siehe 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;
    }
}
Ronnie Royston
quelle
OP wird nicht verwendet new Date(), hat jedoch ein bestimmtes Datum und fragt nur nach dem Subtrahieren von Minuten. Außerdem funktioniert Ihr Code nicht - er gibt den UNIX-Zeitstempel anstelle des Datumsobjekts zurück.
Michał Perłakowski
0

Erweitern Sie die Datumsklasse mit dieser Funktion

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

Sie können also zu jedem Datum eine Anzahl von Minuten, Sekunden, Stunden, Tagen ... hinzufügen oder entfernen.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
Gonzalo Cao
quelle