Как вычесть минуты из даты в javascript?

134

Как я могу перевести этот псевдокод в рабочий 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());
Brendan
источник

Ответы:

200

Как только вы это узнаете:

  • Вы можете создать Date, вызвав конструктор с миллисекундами с 1 января 1970 года.
  • Это количество миллисекунд , прошедших с 1 января 1970 годаvalueOf()Date
  • В 60,000минуте миллисекунды: -]

... это не так уж и сложно.

В приведенном ниже коде новый 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);
Габриэль Л. Оливейра
Вы также можете использовать, var myStartDate = somedate.addMinutes(-durationInMuntes);я предполагаю, что somedate - это объект Date
kubahaha
1
Он работает ... но есть вопрос, что у конструктора Date () есть 3 варианта, то есть 1: пустой, 2: строка и 3: номер года, номер месяца .... так что тот, который используется выше, следует за каким конструктором?
Зафар
3
Программисты верят в ложь о времени, № 32 «В каждой минуте 60 секунд».
Niet the Dark Absol
Для примера того, как это может пойти не так, используя Европу / Лондон в качестве локали часового пояса: 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
81

Вы также можете использовать минуты получения и установки для достижения этой цели:

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. (то есть исключение не возникает.)
Кип
2
@Kip - Спасибо, это понимание, которое делает этот ответ стоящим. Но гарантируют ли это все браузеры? Я спрашиваю, потому что MDN говорит, что разрешены только 0-59 - но я подозреваю, что в этом случае документы просто неверны? См .: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Джастин Этье,
Это было более полезно для меня, я хотел вычесть время из существующего экземпляра объекта Date, который был настроен определенным образом через конструктор. Спасибо!
Билл Эффин Мюррей,
1
Просто помните, что значения .setMinutes(...)дескриптора силы int. Если вы установите значение 1.5 minutesa, Dateто значения 1 minuteсекунд будут такими же, как и раньше.
Габриэль Л. Оливейра
Я получал неверные значения в аналогичном случае использования, когда пробовал startDate = endDate. Похоже, проблема с мелкой копией
raghav710
35

Все галочки, методы запоминать не надо ...

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

или

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

Обновить

После работы с momentjs я должен сказать, что это потрясающая библиотека, которую вам стоит попробовать. Это правда, что во многих случаях срабатывают галочки, делая ваш код очень маленьким, и вам следует постараться сделать свой код как можно меньше для того, что вам нужно делать. Но для чего-нибудь сложного используйте momentjs.

Джейсон Себринг
источник
2
ИМО, это не так просто. Чтобы расшифровать то, что на самом деле делает этот код, требуется некоторое усилие. Лучше всего заключить такую ​​логику в функцию.
sszarek 01
12

moment.js есть несколько действительно удобных методов для управления объектами даты

Метод .subtract позволяет вычесть из даты определенное количество единиц времени, указав количество и строку единиц времени.

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

crashwap
источник
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);
Jitendra
источник
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(), но имеет некоторую указанную дату и спрашивает только о вычитании минут. Кроме того, ваш код не работает - он возвращает временную метку UNIX вместо объекта Date.
Михал Перлаковски,
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");
Гонсало Цао
источник