Uren toevoegen aan Javascript Date-object?

Het verbaast me dat JavaScript’s datumobject niet een voegfunctie van welke aard dan ook implementeert.

Ik wil gewoon een functie die dit kan doen:

var now = Date.now();
var fourHoursLater = now.addHours(4);
function Date.prototype.addHours(h) {
   // how do I implement this?  
}

Ik zou gewoon een paar aanwijzingen in een richting houden.

  • Moet ik string parsing doen?

  • Kan ik Setime gebruiken?

  • Wat dacht u van milliseconden?

Zoals dit:

new Date(milliseconds + 4*3600*1000 /*4 hrs in ms*/)?  

Dit lijkt echter echt hackish – en werkt het zelfs?


Antwoord 1, Autoriteit 100%

JavaScript zelf heeft verschrikkelijke datum / tijd API’s. Niettemin kunt u dit doen in Pure JavaScript:

Date.prototype.addHours = function(h) {
  this.setTime(this.getTime() + (h*60*60*1000));
  return this;
}

Antwoord 2, Autoriteit 70%

Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}

Test:

alert(new Date().addHours(4));

Antwoord 3, Autoriteit 48%

De onderstaande code is om 4 uur tot nu toe toe te voegen (voorbeeld van de datum van vandaag)

var today = new Date();
today.setHours(today.getHours() + 4);

Het zal geen fout veroorzaken als u probeert 4 tot 23 toe te voegen (zie de Docs ):

Als een parameter die u opgeeft buiten het verwachte bereik, sethours () probeert de datuminformatie in het DATUM-object dienovereenkomstig bij te werken


Antwoord 4, Autoriteit 8%

Het is waarschijnlijk beter om de methode van de addhours-methode te maken door een kopie van het datumobject terug te sturen in plaats van de parameter van de parameter te monteren.

Date.prototype.addHours= function(h){
    var copiedDate = new Date(this.getTime());
    copiedDate.setHours(copiedDate.getHours()+h);
    return copiedDate;
}

Op deze manier kunt u een aantal methode-oproepen keten zonder zich zorgen te maken over de staat.


Antwoord 5, Autoriteit 5%

De door Kennebec voorgestelde versie faalt bij het wijzigen van of van DST, omdat het het uurnummer is dat is ingesteld.

this.setUTCHours(this.getUTCHours()+h);

Wordt huren toe aan thisonafhankelijk van tijdsysteem eigenaardigheden.
De methode van Jason Harwig werkt ook.


Antwoord 6, Autoriteit 4%

U kunt het momentjs http://momentjs.com/ bibliotheek gebruiken.

var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();

Antwoord 7, Autoriteit 3%

Krijg een date precies 2 uur vanaf nu, in één regel.

U moet milliseconden doorgeven aan NewDate.

let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
        or
let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );

let nowDate = new Date();
let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );
console.log('now', nowDate);
console.log('expiry', expiryDate);
console.log('expiry 2', expiryDate2);

Snippet uitvouwen


Antwoord 8, autoriteit 2%

Ik vind ook dat het oorspronkelijke object niet moet worden gewijzigd. Dus om toekomstige mankracht te besparen, is hier een gecombineerde oplossing gebaseerd op Jason Harwig’sen Tahir Hasanantwoordt:

Date.prototype.addHours= function(h){
    var copiedDate = new Date();
    copiedDate.setTime(this.getTime() + (h*60*60*1000)); 
    return copiedDate;
}

Antwoord 9

Als je het op een meer functionele manier wilt doen (onveranderlijkheid), zou ik een nieuw datumobject retourneren in plaats van het bestaande te wijzigen en ik zou het prototype niet veranderen, maar een zelfstandige functie maken. Hier is het voorbeeld:

//JS
function addHoursToDate(date, hours) {
  return new Date(new Date(date).setHours(date.getHours() + hours));
}
//TS
function addHoursToDate(date: Date, hours: number): Date {
  return new Date(new Date(date).setHours(date.getHours() + hours));
}
let myDate = new Date();
console.log(myDate)
console.log(addHoursToDate(myDate,2))

Snippet uitvouwen


Antwoord 10

Er is een toevoeging in de Datejs-bibliotheek.

En hier zijn de JavaScript-datummethoden. kennebec noemde wijselijk getHours() en setHours();


Antwoord 11

Controleer of het nog niet is gedefinieerd, definieert het anders op het Date-prototype:

if (!Date.prototype.addHours) {
    Date.prototype.addHours = function(h) {
        this.setHours(this.getHours() + h);
        return this;
    };
}

Antwoord 12

Een andere manier om dit aan te pakken is door de datum te converteren naar unixtime (epoch), dan het equivalent in (milli)seconden toe te voegen en het dan weer terug te converteren. Op deze manier kunt u dag- en maandovergangen afhandelen, zoals 4 uur toevoegen aan 21, wat zou moeten resulteren in de volgende dag, 01:00 uur.


Antwoord 13

Dit is een gemakkelijke manier om een ​​verhoogde of verlaagde gegevenswaarde te krijgen.

const date = new Date()
const inc = 1000 * 60 * 60 // an hour
const dec = (1000 * 60 * 60) * -1 // an hour
const _date = new Date(date)
return new Date( _date.getTime() + inc )
return new Date( _date.getTime() + dec )

Antwoord 14

Probeer dit voor een eenvoudige functie voor het optellen/aftrekken van uren/minuten in javascript:

function getTime (addHour, addMin){
    addHour = (addHour?addHour:0);
    addMin = (addMin?addMin:0);
    var time = new Date(new Date().getTime());
    var AM = true;
    var ndble = 0;
    var hours, newHour, overHour, newMin, overMin;
    //change form 24 to 12 hour clock
    if(time.getHours() >= 13){
        hours = time.getHours() - 12;
        AM = (hours>=12?true:false);
    }else{
        hours = time.getHours();
        AM = (hours>=12?false:true);
    }
    //get the current minutes
    var minutes = time.getMinutes();
    // set minute
    if((minutes+addMin) >= 60 || (minutes+addMin)<0){
        overMin = (minutes+addMin)%60;
        overHour = Math.floor((minutes+addMin-Math.abs(overMin))/60);
        if(overMin<0){
            overMin = overMin+60;
            overHour = overHour-Math.floor(overMin/60);
        }
        newMin = String((overMin<10?'0':'')+overMin);
        addHour = addHour+overHour;
    }else{
        newMin = minutes+addMin;
        newMin = String((newMin<10?'0':'')+newMin);
    }
    //set hour
    if(( hours+addHour>=13 )||( hours+addHour<=0 )){
        overHour = (hours+addHour)%12;
        ndble = Math.floor(Math.abs((hours+addHour)/12));
        if(overHour<=0){
            newHour = overHour+12;
            if(overHour == 0){
                ndble++;
            }
        }else{
            if(overHour ==0 ){
                newHour = 12;
                ndble++;
            }else{
                ndble++;
                newHour = overHour;
            }
        }
        newHour = (newHour<10?'0':'')+String(newHour);
        AM = ((ndble+1)%2===0)?AM:!AM;
    }else{
        AM = (hours+addHour==12?!AM:AM);
        newHour = String((Number(hours)+addHour<10?'0':'')+(hours+addHour));
    }
    var am = (AM)?'AM':'PM';
    return new Array(newHour, newMin, am);
};

Dit kan worden gebruikt zonder parameters om de huidige tijd te krijgen

getTime();

of met parameters om de tijd te krijgen met de toegevoegde minuten/uren

getTime(1,30); // adds 1.5 hours to current time
getTime(2);    // adds 2 hours to current time
getTime(0,120); // same as above

zelfs negatieve tijd werkt

getTime(-1, -30); // subtracts 1.5 hours from current time

deze functie retourneert een array van

array([Hour], [Minute], [Meridian])

Antwoord 15

SPRBRN is correct. Om rekening te houden met het begin/einde van de maand en het jaar, moet je converteren naar Epoch en terug.

Zo doe je dat:

var milliseconds = 0;          //amount of time from current date/time
var sec = 0;                   //(+): future
var min = 0;                   //(-): past
var hours = 2;
var days = 0;
var startDate = new Date();     //start date in local time (we'll use current time as an example)
var time = startDate.getTime(); //convert to milliseconds since epoch
//add time difference
var newTime = time + milliseconds + (1000*sec) + (1000*60*min) + (1000*60*60*hrs) + (1000*60*60*24*days);
var newDate = new Date(newTime); //convert back to date; in this example: 2 hours from right now

of doe het in één regel (waar de namen van variabelen hetzelfde zijn als hierboven:

var newDate = 
    new Date(startDate.getTime() + millisecond + 
        1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));

Antwoord 16

als je het bijvoorbeeld als string nodig hebt:

var defaultTime: new Date().getHours() + 1 + ":" + new Date().getMinutes();

Antwoord 17

Een beetje rommelig, maar het werkt!

Gegeven een datumnotatie zoals deze: 2019-04-03T15:58

 //Get the start date.
  var start = $("#start_date").val();
  //Split the date and time.
  var startarray = start.split("T");
  var date = startarray[0];
  var time = startarray[1];
  //Split the hours and minutes.
  var timearray = time.split(":");
  var hour = timearray[0];
  var minute = timearray[1];
  //Add an hour to the hour.
  hour++;
  //$("#end_date").val = start;
  $("#end_date").val(""+date+"T"+hour+":"+minute+"");

Je output zou zijn: 2019-04-03T16:58


Antwoord 18

Als iemand nog steeds naar dit probleem kijkt, is de eenvoudigste manier om dit te doen

var d = new Date();
d = new Date(d.setHours(d.getHours() + 2));

het voegt 2 uur toe aan de huidige tijd.
Waarde van d = za 30 jan. 2021 23:41:43 GMT+0500 (Pakistaanse standaardtijd)
Waarde van d na toevoeging van 2 uur = zo 31 jan 2021 01:41:43 GMT+0500 (Pakistaanse standaardtijd)

Other episodes