Jak odjąć minuty od daty w javascript?

143

Jak mogę przetłumaczyć ten pseudo kod na działający js [nie martw się, skąd pochodzi data końcowa, z wyjątkiem tego, że jest to poprawna data 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());
brendan
źródło

Odpowiedzi:

210

Kiedy już to wiesz:

  • Możesz utworzyć Date, wywołując konstruktora z milisekundami od 1 stycznia 1970.
  • Litera valueOf()a Dateto liczba milisekund od 1 stycznia 1970 r
  • 60,000Minuta ma milisekundy: -]

... to nie jest takie trudne.

W poniższym kodzie nowy Datejest tworzony przez odjęcie odpowiedniej liczby milisekund od myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);
Daniel LeCheminant
źródło
6
Ale nie radzi sobie, gdy dodajesz minuty. Aby poprawnie obsłużyć dodanie minut, powinieneś użyć .getTime(). Przykład:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira
Możesz również użyć var myStartDate = somedate.addMinutes(-durationInMuntes);zakładam, że któryś to obiekt Date
kubahaha
1
Działa ... ale mam pytanie, że konstruktor Date () ma 3 opcje, tj. 1: pusty 2: string i 3: Number year, Number Month .... więc ten używany powyżej następuje po którym konstruktorze?
Zafar
3
Więcej kłamstw, które programiści wierzą w czas, # 32 „Każda minuta ma 60 sekund”.
Niet the Dark Absol
Na przykład, jak to może się nie udać, używając Europy / Londynu jako lokalizacji strefy czasowej: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);spodziewałbyś esię, że tak się stanie 02:10:00, prawda? Nie. 01:10:00. DST mówi cześć. A potem są sekundy przestępne ...
Niet the Dark Absol
85

Aby to osiągnąć, możesz również skorzystać z funkcji get and set minutes:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);
Miquel
źródło
56
warto zauważyć, że setMinutes()jest wystarczająco inteligentny, aby poprawnie obsługiwać ujemne minuty. Więc jeśli datą rozpoczęcia była 3:05, a chcesz odjąć 30 minut, przechodziłbyś -25do metody setMinutes (), która jest wystarczająco inteligentna, aby wiedzieć, że 3:-25to jest 2:35. (tj. nie zgłasza wyjątku)
Kip
2
@Kip - Dzięki, to jest wgląd, który sprawia, że ​​ta odpowiedź jest warta zachodu. Ale czy wszystkie przeglądarki to gwarantują? Pytam, ponieważ MDN mówi, że tylko 0 - 59 są dozwolone - ale podejrzewam, że doktorzy są po prostu błędni w tym przypadku? Zobacz: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier
Było to dla mnie bardziej przydatne, chciałem odjąć czas od istniejącej instancji obiektu Date, która została skonfigurowana w określony sposób za pomocą konstruktora. Dziękuję Ci!
Bill Effin Murray
1
Pamiętaj tylko, że wartości .setMinutes(...)uchwytów siły int. Jeśli ustawisz 1.5 minutesna a, Dateto tylko ustawi 1 minutei zachowa sekundy takie same jak poprzednio.
Gabriel L. Oliveira
Otrzymywałem nieprawidłowe wartości w podobnym przypadku użycia, gdy próbowałem startDate = endDate. Wygląda na problem, w którym dzieje się płytka kopia
raghav710 Kwietnia
39

Wszystko to tylko kleszcze, nie trzeba zapamiętywać metod ...

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

lub

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

aktualizacja

Po pracy z momentjs muszę powiedzieć, że jest to niesamowita biblioteka, którą powinieneś sprawdzić. Prawdą jest, że znaczniki działają w wielu przypadkach, sprawiając, że kod jest bardzo mały i powinieneś starać się, aby kod był jak najmniejszy ze względu na to, co musisz zrobić. Ale w przypadku wszystkiego, co skomplikowane, użyj momentjs.

Jason Sebring
źródło
2
IMO to nie jest takie proste. Odszyfrowanie tego, co faktycznie robi ten kod, wymaga pewnego wysiłku. Lepszym podejściem jest zawinięcie tego rodzaju logiki w funkcję.
sszarek
13

moment.js ma kilka naprawdę wygodnych metod manipulowania obiektami daty

Metoda .subtract pozwala odjąć określoną ilość jednostek czasu od daty, podając kwotę i ciąg jednostki czasu.

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
źródło
7

Oto co znalazłem:

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

Źródła:

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

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

crashwap
źródło
6
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.

możesz przekonwertować uniksowy znacznik czasu na konwencjonalny czas, używając na new Date()przykład

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.
Rajesh Vinay Kumar
źródło
Dokonałem pewnych zmian w formatowaniu. Upewnij się, że nadal odzwierciedla to, co zamierzałeś opublikować.
adiga
to może nie działać dobrze w pobliżu przejść stref czasowych, lepiej użyj getUTCMinutes + setUTCMinutes
Viktor Mukhachev
1

Spróbuj jak poniżej:

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);
Jitendra
źródło
0

Oto, co zrobiłem: zobacz na 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
źródło
OP nie używa new Date(), ale ma określoną datę i pyta tylko o odejmowanie minut. Ponadto twój kod nie działa - zwraca znacznik czasu UNIX zamiast obiektu Date.
Michał Perłakowski
0

Rozszerz klasę Date za pomocą tej funkcji

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

Możesz więc dodać lub odjąć liczbę minut, sekund, godzin, dni ... do dowolnej daty.

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
źródło