डेट ऑब्जेक्ट क्लोन कैसे करें?


498

एक Dateदूसरे को एक चर सौंपते हुए एक ही उदाहरण के संदर्भ की नकल करेंगे। इसका मतलब है कि एक को बदलने से दूसरे में बदलाव आएगा।

मैं वास्तव में क्लोन या एक Dateउदाहरण की नकल कैसे कर सकता हूं ?

जवाबों:


737

का प्रयोग करें दिनांक वस्तु की getTime()विधि है, जो 1 के बाद से मिलीसेकेंड की संख्या रिटर्न जनवरी 1970 00:00:00 ( युग समय ):

var date = new Date();
var copiedDate = new Date(date.getTime());

सफारी 4 में, आप यह भी लिख सकते हैं:

var date = new Date();
var copiedDate = new Date(date);

... लेकिन मुझे यकीन नहीं है कि यह अन्य ब्राउज़रों में काम करता है या नहीं। (यह IE8 में काम करने लगता है)।


9
इस स्निपेट के लिए JSON? लगता है कि इन लोगों को अपनी मूल बातें स्पष्ट कर लेनी चाहिए ... जैसे जावास्क्रिप्ट डोम के लिए jQuery को गलत करना।
बोल्ड्यूइन

17
इस अच्छे समाधान को लिखने का एक और तरीका यह होगा कि आप दिनांक प्रोटोटाइप का विस्तार करें: Date.prototype.clone = function() { return new Date(this.getTime()); }; जिसे आप तब उपयोग कर सकते हैंcopiedDate = date.clone();
रयान

6
copiedDate = new Date(date)दृष्टिकोण IE6 + में काम करता है। फ़ायरफ़ॉक्स में दो विकल्प समान गति हैं।
रयान

14
new Date(date)उसी के रूप में new Date(date.getTime()), क्योंकि जेएस को कॉल करने की कोशिश की जाएगी date.valueOf()जब उसे एक नंबर की आवश्यकता होगी, और date.valueOf()उसी के रूप में है date.getTime(), संदर्भ Date.valueOf Object.valueOf
स्टीली विंग

10
पहले तरीके से उपयोग new Date(date), उपयोग new Date(date.getTime()या new Date(date.valueOf)इसके बजाय न करें क्योंकि कम से कम फ़ायरफ़ॉक्स और IE (क्रोम नहीं) में तिथियों के बीच अंतर हो सकता है। उदाहरण के लिए toISOString()फ़ायरफ़ॉक्स में दोनों तारीखों का उपयोग कर उत्पन्न करता है "2015-04-21T04:56:42.000Z"और "2015-04-21T04:56:42.337Z"
crudh

114

यह सबसे साफ तरीका है

let dat = new Date() 
let copyOf = new Date(dat.valueOf())

console.log(dat);
console.log(copyOf);


9
"दिनांक" ऑब्जेक्ट के लिए "valueOf ()" विधि अपनी "getTime ()" विधि (युग के समय से मिलीसेकंड की संख्या) के समान परिणाम उत्पन्न करती है।
स्टीव हैरिसन

34
@ सच: सही, लेकिन गेटटाइम () "लग सकता है" जैसे कि यह केवल समय देता है और तारीख को शामिल नहीं करता है इसलिए मेरा संदर्भ "सबसे साफ" है। स्पष्ट रूप से जावास्क्रिप्ट में दिनांक प्रकार आपदा क्षेत्र का एक सा है, यह पहली जगह में कभी नहीं होना चाहिए था।
एंथनीवजोन जूल

1
@AnthonyWJones: सही है, मैं देख रहा हूं कि आपका क्या मतलब है।
स्टीव हैरिसन

3
मैं मानता हूं कि .valueOf () अधिक स्पष्ट है। कभी-कभी मैं भूल जाता हूं और .getMilliseconds () b / c का उपयोग करता हूं, जो मुझे लगता है कि गोक टाइम के बाद इसका मतलब मिलीसेकंड है।
टॉम वायसन

1
+1 करने के लिए स्टीव हैरिसन: मैं सोच रहा था कि क्या यह मामला था, स्पष्टीकरण के लिए धन्यवाद।
ब्रायन लैसी

26
var orig = new Date();
var copy = new Date(+orig);

3
मुझे यह घोल सबसे अच्छा लगता है।
A1run

3
बहुत सटीक और साफ :)
रॉबिनमित्र

33
सिवाय आपको यह समझाने के कि जादू +किसी और लेकिन जेएस विशेषज्ञों के लिए क्या कर रहा है।
Stijn de Witt

8
:) +संकेत यहाँ अपर ऑपरेटर है। इसका मतलब है new Date( Number(orig)) । यहाँ और अधिक: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
लियोनार्ड लेपडाटू

14

सरलीकृत संस्करण:

Date.prototype.clone = function () {
    return new Date(this.getTime());
}

72
आप अंतर्निहित वस्तुओं के साथ गड़बड़ नहीं करेंगे
पावेल

3
तू उन वस्तुओं के साथ मत उलझो, जिन्हें तू नहीं चाहता। आपको एक नई प्रतिलिपि बनानी चाहिए और इसे अपने दायरे के साथ सुपरडेट या कुछ और कहना चाहिए। कीड़े के लिए परीक्षण करने के लिए बहुत कठिन वस्तु की कार्यक्षमता अप्रत्याशित रूप से बदल रही है।
रे फॉस

यह काम करेगा, लेकिन स्थिरता के कारणों के लिए, इस दृष्टिकोण को एक कोड गंध माना जाएगा। मैंने एक दृष्टिकोण लिखा है जिसे मैं आमतौर पर अपने कोडिंग में उपयोग करता हूं: actuts.wordpress.com/2017/01/10/…
एलन

1
इसके अलावा, मुझे पहली जगह में बिल्ट-इन के तरीकों को जोड़ने की कोशिश करने की आवश्यकता नहीं है। कार्यात्मक प्रोग्रामिंग का अध्ययन करें और पता लगाएं कि एक अच्छा पुराने जमाने का फ़ंक्शन वास्तव में ऑब्जेक्ट पर विधियों की तुलना में अधिक शक्तिशाली है। यह भी छोटा है const cloneDate = d => new Date(d.getTime()):।
स्टिजन डे विट

6

मुझे पता चला कि यह सरल कार्य भी काम करता है:

dateOriginal = new Date();
cloneDate = new Date(dateOriginal);

लेकिन मुझे नहीं पता कि यह कितना "सुरक्षित" है। IE7 और Chrome 19 में सफलतापूर्वक परीक्षण किया गया।


9
पहले तरीके से उपयोग new Date(date), उपयोग new Date(date.getTime()या new Date(date.valueOf)इसके बजाय न करें क्योंकि कम से कम फ़ायरफ़ॉक्स और IE (क्रोम नहीं) में तिथियों के बीच अंतर हो सकता है। उदाहरण के लिए toISOString()फ़ायरफ़ॉक्स में दोनों तारीखों का उपयोग कर उत्पन्न करता है "2015-04-21T04:56:42.000Z"और "2015-04-21T04:56:42.337Z"
crudh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.