इस लेखन के रूप में, अन्य उत्तरों में से केवल एक ही सही ढंग से डीएसटी (दिन के समय की बचत समय) बदलाव को संभालता है। यहाँ कैलिफोर्निया में स्थित एक प्रणाली के परिणाम हैं:
1/1/2013- 3/10/2013- 11/3/2013-
User Formula 2/1/2013 3/11/2013 11/4/2013 Result
--------- --------------------------- -------- --------- --------- ---------
Miles (d2 - d1) / N 31 0.9583333 1.0416666 Incorrect
some Math.floor((d2 - d1) / N) 31 0 1 Incorrect
fuentesjr Math.round((d2 - d1) / N) 31 1 1 Correct
toloco Math.ceiling((d2 - d1) / N) 31 1 2 Incorrect
N = 86400000
हालांकि Math.round
सही परिणाम देता है, मुझे लगता है कि यह कुछ हद तक क्लूनी है। इसके बजाय, स्पष्ट रूप से यूटीसी ऑफसेट के लिए लेखांकन द्वारा जब डीएसटी शुरू होता है या समाप्त होता है, हम सटीक अंकगणित का उपयोग कर सकते हैं:
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
function daysBetween(startDate, endDate) {
var millisecondsPerDay = 24 * 60 * 60 * 1000;
return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}
alert(daysBetween($('#first').val(), $('#second').val()));
व्याख्या
जावास्क्रिप्ट तिथि गणना मुश्किल है क्योंकि Date
ऑब्जेक्ट UTC में आंतरिक रूप से संग्रहीत होते हैं , स्थानीय समय नहीं। उदाहरण के लिए, 3/10/2013 12:00 AM प्रशांत मानक समय (UTC-08: 00) 3/10/2013 8:00 AM UTC, और 3/11/2013 12:00 AM प्रशांत डेलाइट समय के रूप में संग्रहीत किया जाता है UTC-07: 00) को 3/11/2013 7:00 AM UTC के रूप में संग्रहीत किया जाता है। इस दिन, UTC में मध्यरात्रि से स्थानीय समय केवल 23 घंटे है!
हालांकि स्थानीय समय में एक दिन 24 घंटे से अधिक या कम हो सकता है, यूटीसी में एक दिन हमेशा 24 घंटे होता है। 1daysBetween
ऊपर दर्शाई गई विधि इस तथ्य का लाभ उठाकर पहली बार कॉल treatAsUTC
करके दोनों स्थानीय समय को आधी रात को यूटीसी को समायोजित करने से पहले घटाती और विभाजित करती है।
1. जावास्क्रिप्ट लीप सेकंड की अनदेखी करता है।