Hvordan legge til 30 minutter på et JavaScript Date-objekt?
Jeg vil gjerne få et Date-objekt som er 30 minutter senere enn et annet Date-objekt. Hvordan gjør jeg det med JavaScript?
Svar #1
Bruke et bibliotek
Hvis du gjør mye arbeid med datoer, kan det hende du vil se nærmere på JavaScript-datobiblioteker som Luxon, Day.js eller Moment.js. For eksempel, med Moment.js, er dette enkelt:
var newDateObj = moment(oldDateObj).add(30, 'm').toDate();
Vanilje Javascript
Dette er som kaosets svar, men på én linje:
var newDateObj = new Date(oldDateObj.getTime() + diff*60000);
Hvor diff er forskjellen i minutter du ønsker fra oldDateObjs tid. Den kan til og med være negativ.
Eller som en gjenbrukbar funksjon, hvis du trenger å gjøre dette flere steder:
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
Og bare for å være sikker på at dette ikke er åpenbart, grunnen til at vi multipliserer minutter med 60000 er for å konvertere minutter til millisekunder.
Vær forsiktig med Vanilla Javascript. Datoer er vanskelige!
Du kan tro at du kan legge til 24 timer til en dato for å få morgendagens dato, ikke sant? Feil!
addMinutes(myDate, 60*24); //DO NOT DO THIS
Det viser seg at hvis brukeren følger sommertid, er ikke en dag nødvendigvis 24 timer lang. Det er én dag i året som bare er 23 timer lang, og én dag i året som er 25 timer lang. For eksempel, i det meste av USA og Canada, er 24 timer etter midnatt 2. november 2014 fortsatt 2. november:
const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!
Dette er grunnen til at det er tryggere å bruke et av de ovennevnte bibliotekene hvis du må gjøre mye arbeid med dette.
Nedenfor er en mer generell versjon av denne funksjonen som jeg skrev. Jeg vil fortsatt anbefale å bruke et bibliotek, men det kan være overdrevet/umulig for prosjektet ditt. Syntaksen er modellert etter MySQL DATE_ADD-funksjonen.
/**
* Adds time to a date. Modelled after MySQL DATE_ADD function.
* Example: dateAdd(new Date(), 'minute', 30) //returns 30 minutes from now.
* https://stackoverflow.com/a/1214753/18511
*
* @param date Date to start with
* @param interval One of: year, quarter, month, week, day, hour, minute, second
* @param units Number of units of the given interval to add.
*/
function dateAdd(date, interval, units) {
if(!(date instanceof Date))
return undefined;
var ret = new Date(date); //don't change original date
var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
switch(String(interval).toLowerCase()) {
case 'year' : ret.setFullYear(ret.getFullYear() + units); checkRollover(); break;
case 'quarter': ret.setMonth(ret.getMonth() + 3*units); checkRollover(); break;
case 'month' : ret.setMonth(ret.getMonth() + units); checkRollover(); break;
case 'week' : ret.setDate(ret.getDate() + 7*units); break;
case 'day' : ret.setDate(ret.getDate() + units); break;
case 'hour' : ret.setTime(ret.getTime() + units*3600000); break;
case 'minute' : ret.setTime(ret.getTime() + units*60000); break;
case 'second' : ret.setTime(ret.getTime() + units*1000); break;
default : ret = undefined; break;
}
return ret;
}
Arbeidende jsFiddle-demo.
Svar #2
var d1 = new Date (),
d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Svar #3
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);Svar #4
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);Svar #5
Kanskje noe sånt?
var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);
console.log(v)Svar #6
Jeg lager alltid 7 funksjoner for å jobbe med dato i JS:
addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.
Du kan se et eksempel her: http://jsfiddle.net/tiagoajacobi/YHA8x/
Hvordan bruke:
var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));
Dette er funksjonene:
Date.prototype.addSeconds = function(seconds) {
this.setSeconds(this.getSeconds() + seconds);
return this;
};
Date.prototype.addMinutes = function(minutes) {
this.setMinutes(this.getMinutes() + minutes);
return this;
};
Date.prototype.addHours = function(hours) {
this.setHours(this.getHours() + hours);
return this;
};
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + days);
return this;
};
Date.prototype.addWeeks = function(weeks) {
this.addDays(weeks*7);
return this;
};
Date.prototype.addMonths = function (months) {
var dt = this.getDate();
this.setMonth(this.getMonth() + months);
var currDt = this.getDate();
if (dt !== currDt) {
this.addDays(-currDt);
}
return this;
};
Date.prototype.addYears = function(years) {
var dt = this.getDate();
this.setFullYear(this.getFullYear() + years);
var currDt = this.getDate();
if (dt !== currDt) {
this.addDays(-currDt);
}
return this;
};
Svar #7
Én-linjers kode
var afterSomeMinutes = new Date(new Date().getTime() + minutes * 60000);
hvor minutes er et tall
Svar #8
Slutt å bruke Moment.js
Som anbefalt av andre gode svar, er det i de fleste tilfeller best å bruke et bibliotek når man håndterer datoer. Det er imidlertid viktig å vite at fra og med september 2020 anses Moment.js som arv og bør ikke lenger brukes i nye prosjekter.
Siterer Moments uttalelse i deres offisielle dokumenter:
Vi ønsker å avskrekke bruk av Moment i nye prosjekter fremover. [...] Vi anser nå generelt Moment som et eldre prosjekt i vedlikeholdsmodus. Det er ikke dødt, men det er faktisk ferdig.
Moderne biblioteker
Nedenfor er alternativer anbefalt av Moment.
Luxon
Luxon kan betraktes som utviklingen av Moment. Det er skrevet av Isaac Cambron, en langvarig bidragsyter til Moment. Vennligst les Hvorfor eksisterer Luxon? og Siden For Moment-brukere i Luxon-dokumentasjonen.
- Lokaler:
Intllevert - Tidssoner:
Intllevert
import {DateTime} from 'luxon'
function addMinutes(date, minutes) {
return DateTime.fromJSDate(date).plus({minutes}).toJSDate()
}
Day.js
Day.js er designet for å være en minimalistisk erstatning for Moment.js, ved å bruke et lignende API. Det er ikke en direkte erstatning, men hvis du er vant til å bruke Moments API og ønsker å komme i gang raskt, kan du vurdere å bruke Day.js.
- Lokaler: Egne datafiler som kan importeres individuelt
- Tidssoner:
Intllevert, via en plugin
import dayjs from 'dayjs'
function addMinutes(date, minutes) {
return dayjs(date).add(minutes, 'minutes').toDate()
}
date-fns
Date-fns tilbyr en rekke funksjoner for å manipulere JavaScript Date-objekter. For mer informasjon, bla til «Hvorfor date-fns?» på date-fns-hjemmesiden.
- Lokaler: Egne datafiler som kan importeres individuelt
- Tidssoner:
Intllevert, via et eget følgebibliotek
import {addMinutes} from 'date-fns'
function addMinutesDemo(date, minutes) {
return addMinutes(date, minutes)
}
js-Joda
js-Joda er en JavaScript-port av Javas Three-Ten Backport, som er grunnlaget for JSR-310-implementeringen av Java SE 8 java.time-pakken. Hvis du er kjent med java.time, Joda-Time eller Noda Time, vil du finne js-Joda sammenlignbar.
- Lokaler: Egne datafiler via tilleggmodul
- Tidssoner: Tilpassede datafiler via tilleggmodul
import {LocalDateTime, nativeJs, convert} from '@js-joda/core'
function addMinutes(date, minutes) {
return convert(
LocalDateTime.from(
nativeJs(date)
).plusMinutes(minutes)
).toDate()
}
Svar #9
Én-linjer uten verktøy:
new Date(+new Date() + 60000*15) // +15 minutes
Svar #10
Den enkleste måten å løse det på er å innse at i JavaScript er datoer bare tall. Det starter 0 eller 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Hver 1 representerer ett millisekund. Du kan legge til eller trekke fra millisekunder ved å hente verdien og opprette en ny dato ved hjelp av den verdien. Du kan håndtere det ganske enkelt med det i bakhodet.
const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));
console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)
Svar #11
Dette er hva jeg gjør, som ser ut til å fungere ganske bra:
Date.prototype.addMinutes = function(minutes) {
var copiedDate = new Date(this.getTime());
return new Date(copiedDate.getTime() + minutes * 60000);
}
Da kan du bare kalle dette slik:
var now = new Date();
console.log(now.addMinutes(50));
Svar #12
Du bør hente verdien av gjeldende dato for å få datoen med (ms) og legge til (30 * 60 * 1000) til den. Nå har du (nåværende dato + 30 min) med ms
console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))