Como subtrair minutos de uma data em javascript?

133

Como posso traduzir esse pseudo-código em js em funcionamento [não se preocupe com a origem da data de término, exceto que é uma data javascript válida].

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
fonte

Respostas:

199

Depois de saber isso:

  • Você pode criar um Datechamando o construtor com milissegundos desde 1 de janeiro de 1970.
  • O valueOf()um Dateé o número de milissegundos desde 1 de janeiro de 1970
  • 60,000milissegundos em um minuto: -]

... não é tão difícil.

No código abaixo, um novo Dateé criado subtraindo o número apropriado de milissegundos de myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);
Daniel LeCheminant
fonte
6
Mas não funciona quando você adiciona minutos. Para lidar corretamente quando você adiciona minutos, você deve usar .getTime(). Exemplo:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira
Você também pode usar var myStartDate = somedate.addMinutes(-durationInMuntes);Presumo somedate é um objeto Date
kubahaha
1
Funciona ... mas há uma dúvida de que o construtor Date () possui 3 opções, ou seja, 1: vazio 2: string e 3: Number year, Number Month .... então o que está sendo usado acima segue qual construtor?
Zafar 31/03
3
Mais programadores de falsidades acreditam no tempo, nº 32 "Há 60 segundos a cada minuto."
Niet the Dark Absol
Para um exemplo de como isso pode dar errado, usando Europe / London como a localidade fuso horário: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);você esperaria eser 02:10:00, certo? Não. 01:10:00. DST diz oi. E depois há segundos bissextos ...
Niet the Dark Absol 4/17
81

Você também pode usar obter e definir minutos para alcançá-lo:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);
Miquel
fonte
52
vale a pena notar que setMinutes()é inteligente o suficiente para lidar com minutos negativos corretamente. Então, se data de início foi 03:05, e você quer subtrair 30 minutos, você estaria passando -25a setMinutes (), que é inteligente o suficiente para saber que 3:-25é 2:35. (ou seja, não lançar uma exceção.)
Kip
2
@ Kip - Obrigado, essa é a visão que faz essa resposta valer a pena. Mas todos os navegadores garantem isso? Pergunto porque o MDN diz que apenas 0 - 59 são permitidos - mas suspeito que os documentos estejam errados nesse caso? Veja: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier 13/12
Isso foi mais útil para mim, eu queria subtrair a hora de uma instância existente do objeto Date que foi configurada de uma maneira específica pelo construtor. Obrigado!
Bill Murray Effin
1
Lembre-se de que a .setMinutes(...)força manipula intvalores. Se você definir 1.5 minutesum, Dateele somente definirá 1 minutee manterá os segundos como antes.
Gabriel L. Oliveira
Eu estava obtendo valores errados em um caso de uso semelhante quando tentei startDate = endDate. Parece que o problema onde uma cópia superficial acontece
raghav710
35

Tudo é apenas carrapatos, não há necessidade de memorizar métodos ...

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

ou

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

atualizar

Depois de trabalhar com o momentjs, devo dizer que esta é uma biblioteca incrível que você deve conferir. É verdade que os ticks funcionam em muitos casos, tornando seu código muito pequeno e você deve tentar torná-lo o menor possível para o que você precisa fazer. Mas para qualquer coisa complicada, use momentjs.

Jason Sebring
fonte
2
IMO isso não é tão simples. É preciso algum esforço para descriptografar o que esse código realmente faz. A melhor abordagem é envolver esse tipo de lógica em uma função.
Sszarek 01/09
12

O moment.js tem alguns métodos de conveniência muito bons para manipular objetos de data

O método .subtract permite subtrair uma certa quantidade de unidades de tempo de uma data, fornecendo a quantidade e uma string de unidade de tempo.

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
fonte
6

Isto é o que eu encontrei:

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

Fontes:

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

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

crashwap
fonte
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.

você pode converter o registro de data e hora do Unix em horário convencional usando new Date().

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.
Rajesh Vinay Kumar
fonte
Fiz algumas alterações de formatação. Certifique-se de que ainda reflete o que você pretendia postar.
Adiga 6/11
1

Tente como abaixo:

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

Isto é o que eu fiz: veja no 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
fonte
O OP não usa new Date(), mas tem uma data especificada e perguntou apenas sobre a subtração de minutos. Além disso, seu código não funciona - ele retorna o carimbo de data e hora do UNIX em vez do objeto Date.
Michał Perłakowski
0

Estender a classe Date com esta função

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

Assim, você pode adicionar ou subtrair vários minutos, segundos, horas, dias ... a qualquer data.

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
fonte