Як я віднімаю хвилини від дати в 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

Як тільки ви знаєте це:

  • Ви можете створити Date, зателефонувавши конструктору з мілісекундами з 1 січня 1970 року.
  • А valueOf()- Dateце кількість мілісекунд з 1 січня 1970 року
  • За 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);Я припускаю, що колись є об'єктом дати
кубахаха

1
Це працює ... але у вас є питання, що у конструктора Date () є 3 варіанти, тобто 1: порожній 2: рядок і 3: Число року, Число Місяць .... Отже, той, що використовується вище, випливає з якого конструктора?
Зафар


Як приклад того , як це може статися, використовуючи Європа / Лондон в якості тимчасової зони локалізації: 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

Ви також можете скористатись функцією get і set хвилин для її досягнення:

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/uk/JavaScript/Reference/Global_Objects/…
Джастін Етьє

Це було більш корисним для мене, я хотів відняти час з існуючого екземпляра об'єкта Date, який був створений певним чином через конструктор. Дякую!
Білл Еффін Мюррей

1
Просто пам’ятайте, що значення .setMinutes(...)сили обробки int. Якщо встановити 1.5 minutesв 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

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


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().for example

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

Я вніс деякі зміни форматування. Переконайтеся, що він все ще відображає те, що ви мали намір опублікувати.
адига

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

ОП не використовує new Date(), але має певну дату і запитує лише про віднімання хвилин. Також ваш код не працює - він повертає часову позначку UNIX замість об'єкта Date.
Michał Perłakowski

0

Розширити клас дат за допомогою цієї функції

// 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");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.