जावास्क्रिप्ट तिथि ऑब्जेक्ट में घंटे जोड़ना?


399

यह मुझे आश्चर्यचकित करता है कि जावास्क्रिप्ट की दिनांक ऑब्जेक्ट किसी भी प्रकार के ऐड फ़ंक्शन को लागू नहीं करता है।

मुझे बस एक फंक्शन चाहिए जो यह कर सके:

var now = Date.now();
var fourHoursLater = now.addHours(4);

function Date.prototype.addHours(h) {

   // how do I implement this?  

}

मैं एक दिशा में कुछ संकेत देना चाहूंगा।

  • क्या मुझे स्ट्रिंग पार्सिंग करने की आवश्यकता है?

  • क्या मैं सेटटाइम का उपयोग कर सकता हूं?

  • मिलीसेकंड के बारे में कैसे?

ऐशे ही:

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

यह वास्तव में हैकिश लगता है - और क्या यह भी काम करता है?

जवाबों:


422

जावास्क्रिप्ट में ही भयानक तारीख / समय एपीआई है। फिर भी, आप इसे शुद्ध जावास्क्रिप्ट में कर सकते हैं:

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

एक जादू की तरह काम करता है! धन्यवाद
moreirapontocom

यदि प्रति के अनुसार आप एक घंटे जोड़ रहे थे, तो यह अगले दिन खत्म हो जाएगा, क्या यह इसे पकड़ लेगा और सब कुछ ठीक से बढ़ा देगा (दिन महीने)?
cdoern

@ मुझे लगता है कि यह होगा, क्योंकि getTime () मिलिसेकंड लौटेगा और आप बस इसमें और मिलीसेकंड
जोड़ेंगे

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

परीक्षा:

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

25
मुझे नहीं लगता कि यह काम करता है --- उदाहरण के लिए 23 घंटे के साथ किसी चीज़ पर इसका परीक्षण करें? जेसन हारविग का जवाब मेरे लिए दिमाग में आया।
डोमिनिक

11
जावास्क्रिप्ट में ऑब्जेक्ट प्रोटोटाइप में चीजों को जोड़ने के लिए यह बुरा अभ्यास है, और डोमिनिक सही है, यह काम नहीं करता है। नीचे जेसन हारविग का समाधान बेहतर है।
आईकोड

19
@ डोमिनिक यह 23:00 के साथ ठीक काम करता है, फ़ायरफ़ॉक्स 10, क्रोम 21 और IE 8/9 के जावास्क्रिप्ट कंसोल के अंदर परीक्षण किया गया है। यहां मैंने जिस कोड का परीक्षण किया है: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) यह सेटमिन्यूट्स के साथ भी ठीक काम करता है ()
tanguy_k

4
इस समाधान के साथ मुद्दों में भाग - DST परिवर्तन बिंदु पर मेरे लिए 1 से वृद्धि विफल रही (एक घंटे आगे बढ़ें)।
andrewb

2
इसे भी काट लिया गया - मैं सेटहॉर्स (गेटहॉर्स -1) का उपयोग करके घंटों के माध्यम से लूप कर रहा था: अब, पहले डीएसटी घंटे में, यह एक अनंत लूप होता है। तो, परिणाम की जांच करें!
cfstras

165

नीचे दिए गए कोड को तारीख में 4 घंटे जोड़ना है (उदाहरण आज की तारीख)

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

यदि आप 4 से 23 को जोड़ने का प्रयास करते हैं तो यह त्रुटि का कारण नहीं बनेगा ( डॉक्स देखें ):

यदि आपके द्वारा निर्दिष्ट कोई पैरामीटर अपेक्षित सीमा से बाहर है, तो सेटहॉर्स () दिनांक जानकारी को दिनांक ऑब्जेक्ट में तदनुसार अद्यतन करने का प्रयास करता है


मैंने यह नहीं देखा और एक नकली उत्तर दिया। मुझे यह तरीका पसंद है। सटीक और उपयोगी।
गंडालफ व्हाइट

यह काम तब नहीं लगता जब घंटे एक दशमलव होते हैं (पूर्णांक नहीं)
gregmagdits

3
यह यहाँ सबसे अच्छा जवाब है ... दिनांक प्रोटोटाइप में "addHours" जोड़ना चिंताजनक है क्योंकि कुछ बिंदु पर JS उस फ़ंक्शन के लिए समर्थन जोड़ सकता है और फिर आपके पास एक विरोधाभासी प्रोटोटाइप है। यह आपको केवल अधिक से अधिक कोड का उपयोग करके एक कार्यक्षमता प्रदान करता है।
क्रिश बॉयड

आश्चर्य है, लेकिन यह वास्तव में वेतन वृद्धि के दिन, महीने अगर इसकी जरूरत है, डॉक्स के लिए लिंक उपयोगी होगा
2

4
घंटे मान का उपयोग करते हुए> 23 इसे नहीं तोड़ता है, फिर भी यह दिन के उजाले की बचत सीमाओं पर टूट गया है । यह देखते हुए कि यह टूट गया है, इसका उपयोग करने का कोई कारण नहीं है; पसंद करते हैं setTimeया setUTCHour
मार्क अमेरी

40

संभवतः अपने पैरामीटर को म्यूट करने के बजाय दिनांक ऑब्जेक्ट की प्रतिलिपि वापस करके AddHours विधि को अपरिवर्तनीय बनाना बेहतर है।

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

इस तरह से आप राज्य के बारे में चिंता किए बिना विधि कॉल का एक गुच्छा श्रृंखला कर सकते हैं।


इस फ़ंक्शन में समान समस्याएं हैं जैसा कि यहां बताया गया है stackoverflow.com/questions/1050720/… यह वास्तव में इस बारे में नहीं है कि यह कुछ ब्राउज़रों पर काम करता है, बल्कि अन्य स्थानों पर जो जावास्क्रिप्ट का उपयोग करते हैं, इसे एक मुद्दे के रूप में देखते हैं। इस के साथ अपने समाधान का
मुकाबला

1
आपको फ़ंक्शन के नाम को बदलने पर विचार करना चाहिए, क्योंकि शब्द add*का उपयोग आमतौर पर ऑब्जेक्ट को म्यूट करने के लिए किया जाता है।
mr5

@ mr5 - उस बारे में निश्चित नहीं है, addइसका उपयोग .NET फ्रेमवर्क DateTimeक्लास में किया जाता है , और +गणित में (प्लस) के समान अर्थ है ।
ताहिर हसन

1
currentDate.addHours(1)<- मेरी प्रोग्रामिंग वृत्ति से, मैं currentDateमूल्य बदलने की उम्मीद कर रहा हूं , लेकिन आपके कार्यान्वयन में, यह नहीं होगा। जैसा कि मैं सुझाव दे रहा हूं कि मैं अपना नाम बदलकर या कुछ
बदलकर रखूं

1
@TahirHassan का तकनीकी विवरण से कोई लेना देना नहीं है, लेकिन फ़ंक्शन नाम के लिए उपयोग करने के लिए सही शब्द चुनने पर। मैं अभी भी परिवर्तनशील संस्करण को पसंद करता हूं जब फ़ंक्शन के साथ उपसर्ग होता हैadd
mr5

23

केनेबेक द्वारा सुझाए गए संस्करण को डीएसटी से बदलते समय या उसके बाद विफल हो जाएगा, क्योंकि यह घंटे की संख्या निर्धारित है।

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

समय प्रणाली की स्वतंत्रताओं के लिए hघंटों को जोड़ देगा this। जेसन हारविग की विधि भी काम करती है।



7

मुझे भी लगता है कि मूल वस्तु को संशोधित नहीं किया जाना चाहिए। तो भविष्य की जनशक्ति को बचाने के लिए जेसन हारविग और ताहिर हसन के जवाबों पर आधारित एक संयुक्त समाधान है:

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


4

जांचें कि क्या यह पहले से परिभाषित नहीं है, अन्यथा इसे दिनांक प्रोटोटाइप पर परिभाषित करता है:

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

3

इसे संभालने का एक और तरीका यह है कि तारीख को यूक्सीटाइम (युग) में बदल दिया जाए, फिर समतुल्य को (मिली) सेकंड में जोड़ें, फिर इसे वापस बदलें। इस तरह आप दिन और महीने के बदलाव को संभाल सकते हैं, जैसे 4 घंटे को 21 पर जोड़ना, जिसका परिणाम अगले दिन, 01:00 बजे होना चाहिए।


आप सही हैं - लेकिन आप कुछ साल देर से भी कर रहे हैं। जेसन हारविग के जवाब ने आपको 2 साल पहले यह तरीका दिखाया था; यह उत्तर कुछ नया नहीं जोड़ता है।
मार्क अमेरी

3

जावास्क्रिप्ट में एक साधारण जोड़ / घटाव / मिनट समारोह के लिए, यह प्रयास करें:

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

यह मौजूदा समय पाने के लिए मापदंडों के बिना इस्तेमाल किया जा सकता है

getTime();

या मापदंडों के साथ जोड़ा मिनट / घंटे के साथ समय पाने के लिए

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

नकारात्मक समय भी काम करता है

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

यह फ़ंक्शन एक सरणी देता है

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

किसी फ़ंक्शन के 56-लाइन मॉन्स्टर के पास शीर्ष-वोट किए गए उत्तर में दो-लाइन दृष्टिकोण से अधिक लाभ क्या है ? -1 क्योंकि बिना किसी फ़ायदे के मैं यहाँ बहुत अधिक अतिरिक्त जटिलताएँ देख सकता हूँ।
मार्क अमेरी

1

SPRBRN सही है। महीने और वर्ष की शुरुआत / अंत के लिए खाते में, आपको युग और पीठ में बदलने की आवश्यकता है।

यहां बताया गया है कि आप ऐसा कैसे करते हैं:

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)

var newDate = new Date(newTime);//convert back to date; in this example: 2 hours from right now


या इसे एक पंक्ति में करें (जहां चर नाम ऊपर के समान हैं:

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

0

यह बढ़े हुए या घटे हुए डेटा मान पाने का एक आसान तरीका है।

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 )

-1

थोड़ा गड़बड़ है, लेकिन यह काम करता है!

इस तरह एक तारीख प्रारूप को देखते हुए: 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+"");

आपका आउटपुट होगा: 2019-04-03T16: 58

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.