दिलचस्प पोस्ट
जावा में निरर्थक स्ट्रिंग्स को शामिल करना कितना सच है "गति चाहते हैं? मूल्य से गुजारें " विशिष्ट प्रकार के सदस्य को LINQ में इकाईयों में समर्थित नहीं है केवल प्रारंभिक, इकाई के सदस्य, और इकाई नेविगेशन गुण समर्थित हैं जावा थ्रेड में मैं एक पैरामीटर कैसे पास कर सकता हूं? मोबाइल सफारी ऑटोफोकस टेक्स्ट फ़ील्ड Android पर गुरुत्वाकर्षण और लेआउट के बीच का अंतर मैं सूची <T> 'सी' में विधि जोड़ने के लिए ओवरराइड कैसे करूं? Android में ViewPager से खंड पृष्ठ को निकालें सबसे उपयोगी आर चाल क्या है? कम से कम अंतर वाले दो सेटों में एक सरणी को विभाजित करें ब्राउज़र बैक बटन इवेंट का पता लगाने के लिए – क्रॉस ब्राउज़र चेकबॉक्स की डिफ़ॉल्ट छवियों को कैसे बदला जाए ऐप बंद होने पर पुश नोटिफिकेशन एचटीएमएल / सीएसएस में चेकबॉक्स आकार एक्सेल VBA का उपयोग कर कमांड प्रॉम्प्ट में एक कमांड निष्पादित करें

दो एनएसडीट्स के बीच दिनों की संख्या

मैं दो NSDate मूल्यों के बीच के दिनों की संख्या कैसे तय कर सकता हूं (ध्यान में रखते समय भी)?

NSDate मान जो कुछ भी रूप [NSDate date] लेते हैं

विशेष रूप से, जब कोई उपयोगकर्ता मेरे iPhone ऐप में निष्क्रिय स्थिति में प्रवेश करता है, तो मैं निम्न मान को संग्रहित करता हूं:

 exitDate = [NSDate date]; 

और जब वे ऐप वापस ऊपर खोलते हैं, तो मुझे वर्तमान समय मिलता है:

 NSDate *now = [NSDate date]; 

अब मैं निम्नलिखित को लागू करना चाहता हूं:

 -(int)numberOfDaysBetweenStartDate:exitDate andEndDate:now 

वेब के समाधान से एकत्रित समाधान "दो एनएसडीट्स के बीच दिनों की संख्या"

यहाँ एक कार्यान्वयन है जो मैं दो तिथियों के बीच कैलेंडर दिनों की संख्या निर्धारित करता था:

 + (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime { NSDate *fromDate; NSDate *toDate; NSCalendar *calendar = [NSCalendar currentCalendar]; [calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate interval:NULL forDate:fromDateTime]; [calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate interval:NULL forDate:toDateTime]; NSDateComponents *difference = [calendar components:NSCalendarUnitDay fromDate:fromDate toDate:toDate options:0]; return [difference day]; } 

संपादित करें:

ऊपर बढ़िया समाधान, NSDate पर एक विस्तार के रूप में नीचे स्विफ्ट संस्करण है:

 extension NSDate { func numberOfDaysUntilDateTime(toDateTime: NSDate, inTimeZone timeZone: NSTimeZone? = nil) -> Int { let calendar = NSCalendar.currentCalendar() if let timeZone = timeZone { calendar.timeZone = timeZone } var fromDate: NSDate?, toDate: NSDate? calendar.rangeOfUnit(.Day, startDate: &fromDate, interval: nil, forDate: self) calendar.rangeOfUnit(.Day, startDate: &toDate, interval: nil, forDate: toDateTime) let difference = calendar.components(.Day, fromDate: fromDate!, toDate: toDate!, options: []) return difference.day } } 

आपके उपयोग के मामले पर निर्भर करता है कि जिस पर आप को हटाना चाहते हैं, उसे खोलने के लिए कुछ बल बल।

उपर्युक्त समाधान वर्तमान समय क्षेत्र के अलावा अन्य समय क्षेत्र के लिए भी काम करता है, जो किसी एप के लिए बिल्कुल सही है जो दुनिया भर के स्थानों के बारे में जानकारी दिखाता है।

यहां मैंने पाया सबसे अच्छा उपाय है NSDates के बीच किसी भी मात्रा में इकाइयों को निर्धारित करने के लिए एप्पल द्वारा अनुमोदित विधि का उपयोग करना लगता है

 - (int)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2 { NSUInteger unitFlags = NSDayCalendarUnit; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0]; return [components day]+1; } 

उदाहरण के लिए यदि आप महीनों के लिए भी चाहते हैं, तो आप 'एनएसएमओन्थ कैलेंडर यूनिट' को यूनिट फ्लैग के रूप में शामिल कर सकते हैं।

मूल ब्लॉगर को क्रेडिट करने के लिए, मुझे यह जानकारी मिली है (हालांकि थोड़ी सी गलती थी जो मैंने ऊपर तय की है): http://cocoamatic.blogspot.com/2010/09/nsdate-number-of-days-between- दो dates.html? showComment = 1306198273659 # c6501446329564880344

स्विफ्ट 3.0 अपडेट

 extension Date { func differenceInDaysWithDate(date: Date) -> Int { let calendar = Calendar.current let date1 = calendar.startOfDay(for: self) let date2 = calendar.startOfDay(for: date) let components = calendar.dateComponents([.day], from: date1, to: date2) return components.day ?? 0 } } 

स्विफ्ट 2.0 अपडेट

 extension NSDate { func differenceInDaysWithDate(date: NSDate) -> Int { let calendar: NSCalendar = NSCalendar.currentCalendar() let date1 = calendar.startOfDayForDate(self) let date2 = calendar.startOfDayForDate(date) let components = calendar.components(.Day, fromDate: date1, toDate: date2, options: []) return components.day } } 

मूल समाधान

स्विफ्ट में एक और समाधान

अगर आपका उद्देश्य दो तिथियों के बीच सटीक दिन का नंबर प्राप्त करना है, तो आप इस तरह इस मुद्दे के आसपास काम कर सकते हैं:

 // Assuming that firstDate and secondDate are defined // ... var calendar: NSCalendar = NSCalendar.currentCalendar() // Replace the hour (time) of both dates with 00:00 let date1 = calendar.startOfDayForDate(firstDate) let date2 = calendar.startOfDayForDate(secondDate) let flags = NSCalendarUnit.DayCalendarUnit let components = calendar.components(flags, fromDate: date1, toDate: date2, options: nil) components.day // This will return the number of day(s) between dates 

मैं इसे NSDate वर्ग के लिए श्रेणी पद्धति के रूप में उपयोग करता हूं

 // returns number of days (absolute value) from another date (as number of midnights beween these dates) - (int)daysFromDate:(NSDate *)pDate { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSInteger startDay=[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:[NSDate date]]; NSInteger endDay=[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:pDate]; return abs(endDay-startDay); } 

मुझे शुरुआती दिन सहित दो तिथियों के बीच दिनों की संख्या की आवश्यकता है जैसे कि 14-2-2012 और 16-2-2012 के बीच के दिनों में 3 परिणाम आएंगे

 + (NSInteger)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2 { NSUInteger unitFlags = NSDayCalendarUnit; NSCalendar* calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0]; NSInteger daysBetween = abs([components day]); return daysBetween+1; } 

ध्यान दें कि यह कोई फर्क नहीं पड़ता कि आप किस तारीख को प्रदान करते हैं। यह हमेशा एक सकारात्मक संख्या वापस करेगा

 NSDate *lastDate = [NSDate date]; NSDate *todaysDate = [NSDate date]; NSTimeInterval lastDiff = [lastDate timeIntervalSinceNow]; NSTimeInterval todaysDiff = [todaysDate timeIntervalSinceNow]; NSTimeInterval dateDiff = lastDiff - todaysDiff; 

dateDiff तब दो तिथियों के बीच दूसरे की संख्या होगी। सिर्फ एक दिन में सेकेंड की संख्या से विभाजित करें।

@Brian

ब्रायन का उत्तर अच्छा है, लेकिन 24 घंटों के मामले में दिन में अंतर की गणना की जाती है, लेकिन कैलेंडर दिन मतभेद नहीं। उदाहरण के लिए 23:59, 24 दिसंबर क्रिसमस दिवस से केवल 1 मिनट दूर है, कई अनुप्रयोगों के प्रयोजन के लिए जो एक दिन अभी भी माना जाता है ब्रायन के दिनों फ़ंक्शन के बीच 0 पर वापस आ जाएगा

ब्रायन के मूल कार्यान्वयन और शुरुआत / दिन के अंत से उधार लेना, मैं अपने कार्यक्रम में निम्नलिखित का उपयोग करता हूं: ( दिन की शुरुआत और अंत की NSDate शुरुआत )

 - (NSDate *)beginningOfDay:(NSDate *)date { NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *components = [cal components:( NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date]; [components setHour:0]; [components setMinute:0]; [components setSecond:0]; return [cal dateFromComponents:components]; } - (NSDate *)endOfDay:(NSDate *)date { NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *components = [cal components:( NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date]; [components setHour:23]; [components setMinute:59]; [components setSecond:59]; return [cal dateFromComponents:components]; } - (int)daysBetween:(NSDate *)date1 and:(NSDate *)date2 { NSDate *beginningOfDate1 = [self beginningOfDay:date1]; NSDate *endOfDate1 = [self endOfDay:date1]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *beginningDayDiff = [calendar components:NSDayCalendarUnit fromDate:beginningOfDate1 toDate:date2 options:0]; NSDateComponents *endDayDiff = [calendar components:NSDayCalendarUnit fromDate:endOfDate1 toDate:date2 options:0]; if (beginningDayDiff.day > 0) return beginningDayDiff.day; else if (endDayDiff.day < 0) return endDayDiff.day; else { return 0; } } 

एक अन्य दृष्टिकोण:

 NSDateFormatter* dayFmt = [[NSDateFormatter alloc] init]; [dayFmt setTimeZone:<whatever time zone you want>]; [dayFmt setDateFormat:@"g"]; NSInteger firstDay = [[dayFmt stringFromDate:firstDate] integerValue]; NSInteger secondDay = [[dayFmt stringFromDate:secondDate] integerValue]; NSInteger difference = secondDay - firstDay; 

समय के अंतराल पर लाभ होता है timeIntervalSince... स्कीम को उस समय क्षेत्र को ध्यान में रखा जा सकता है, और अंतराल के साथ कुछ ही सेकंड में एक या एक दिन की लंबी अवधि में कोई अस्पष्टता नहीं है।

और NSDateComponents दृष्टिकोण से थोड़ा और अधिक कॉम्पैक्ट और कम भ्रमित।

स्विफ्ट में ऐसा करने का प्रयास करते हुए इस पृष्ठ पर जाने वाले लोगों के लिए सिर्फ एक जवाब जोड़ना दृष्टिकोण बहुत ही वही है।

 private class func getDaysBetweenDates(startDate:NSDate, endDate:NSDate) -> NSInteger { var gregorian: NSCalendar = NSCalendar.currentCalendar(); let flags = NSCalendarUnit.DayCalendarUnit let components = gregorian.components(flags, fromDate: startDate, toDate: endDate, options: nil) return components.day } 

यह उत्तर यहां मिले, निम्नलिखित विधि के चर्चा अनुभाग में:

 components(_:fromDate:toDate:options:) 

स्विफ्ट में ब्रायन के कार्य का कार्यान्वयन यहां दिया गया है:

 class func daysBetweenThisDate(fromDateTime:NSDate, andThisDate toDateTime:NSDate)->Int?{ var fromDate:NSDate? = nil var toDate:NSDate? = nil let calendar = NSCalendar.currentCalendar() calendar.rangeOfUnit(NSCalendarUnit.DayCalendarUnit, startDate: &fromDate, interval: nil, forDate: fromDateTime) calendar.rangeOfUnit(NSCalendarUnit.DayCalendarUnit, startDate: &toDate, interval: nil, forDate: toDateTime) if let from = fromDate { if let to = toDate { let difference = calendar.components(NSCalendarUnit.DayCalendarUnit, fromDate: from, toDate: to, options: NSCalendarOptions.allZeros) return difference.day } } return nil } 

क्या आप कैलेंडर दिनों या 24-घंटे की अवधि का मतलब है? यानी मंगलवार को 9 पीएम बुधवार को एक दिन पहले 6:00 या एक दिन से भी कम समय पर होता है?

यदि आप पूर्व का मतलब है, यह थोड़ा जटिल है और आपको NSCalendar और NSDateComponent NSCalendar माध्यम से NSCalendar का सहारा लेना होगा, जो मुझे अपने सिर के ऊपर से नहीं याद करते हैं।

यदि आप बाद का मतलब है, तो संदर्भ की तिथि के बाद की तारीखों का समय अंतराल प्राप्त करें, दूसरे से एक घटाएं, और 24 घंटे ( 24 * 60 * 60 ) से विभाजित करें, अनुमानित अंतराल प्राप्त करने के लिए, छलांग संख्याएं शामिल न करें।

एक मिल गया, यह सुनिश्चित नहीं है कि आप वास्तव में क्या चाहते हैं, लेकिन यह आप में से कुछ मदद कर सकता है, (मेरी मदद!)

मेरा लक्ष्य यह जानना था कि, दो तारीखों (24 घंटों से कम) के बीच में मुझे "ओवरडे" दिन + 1 था:

मैंने निम्नलिखित किया था (एक सा पुरातन मैं स्वीकार करता हूं)

 NSDate *startDate = ... NSDate *endDate = ... 

NSDate पहले से ही एक अन्य NSDateFormatter द्वारा प्रारूपित है (यह केवल इस उद्देश्य के लिए है 🙂

 NSDateFormatter *dayFormater = [[NSDateFormatter alloc]init]; [dayFormater setDateFormat:@"dd"]; int startDateDay = [[dayFormater stringFromDate:startDate]intValue]; int endDateDay = [[dayFormater stringFromDate:dateOn]intValue]; if (endDateDay > startDateDay) { NSLog(@"day+1"); } else { NSLog(@"same day"); } 

शायद ऐसा कुछ पहले से मौजूद है, लेकिन उसे नहीं मिला

टिम

क्यों न सिर्फ:

 int days = [date1 timeIntervalSinceDate:date2]/24/60/60; 

मैंने पाया समाधान:

 +(NSInteger)getDaysDifferenceBetween:(NSDate *)dateA and:(NSDate *)dateB { if ([dateA isEqualToDate:dateB]) return 0; NSCalendar * gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate * dateToRound = [dateA earlierDate:dateB]; int flags = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit); NSDateComponents * dateComponents = [gregorian components:flags fromDate:dateToRound]; NSDate * roundedDate = [gregorian dateFromComponents:dateComponents]; NSDate * otherDate = (dateToRound == dateA) ? dateB : dateA ; NSInteger diff = abs([roundedDate timeIntervalSinceDate:otherDate]); NSInteger daysDifference = floor(diff/(24 * 60 * 60)); return daysDifference; } 

यहाँ मैं प्रभावी रूप से दिन की शुरुआत से शुरू करने के लिए पहली तारीख को गोल कर रहा हूँ और फिर जोनाथन ऊपर सुझाव दे रहा है के रूप में अंतर की गणना …

मैंने ऐसा करने के लिए एक ओपन सोर्स क्लास / लाइब्रेरी प्रकाशित की है।

RelativeDateDescriptor पर एक नज़र डालें, जिसका उपयोग समय के अंतर को प्राप्त करने के लिए किया जा सकता है …

 RelativeDateDescriptor *descriptor = [[RelativeDateDescriptor alloc] initWithPriorDateDescriptionFormat:@"%@ ago" postDateDescriptionFormat:@"in %@"]; // date1: 1st January 2000, 00:00:00 // date2: 6th January 2000, 00:00:00 [descriptor describeDate:date2 relativeTo:date1]; // Returns '5 days ago' [descriptor describeDate:date1 relativeTo:date2]; // Returns 'in 5 days' 

क्यों ध्यान दें निम्नलिखित NSDate विधि का उपयोग करें:

 - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate 

यह आपकी दो तिथियों के बीच सेकंड की संख्या को वापस करेगा और आप 86,400 दिनों के दिनों की संख्या को विभाजित कर सकते हैं !!