2010-06-26 18 views
6

मेरा प्रश्न सामान्य है "मैं कैसे पता लगा सकता हूं कि एनएसडीएट प्रारंभ दिनांक और समाप्ति दिनांक के बीच है या नहीं?"सभी एनएसडेट्स को प्रारंभ करें और समाप्त करें

मैं जो करना चाहता हूं वह सभी NSDATES (दिन, घंटे या मिनट नहीं) है जो प्रारंभ दिनांक और समाप्ति दिनांक के बीच होता है। उन तिथियों सहित, बेहतर नहीं होगा, हालांकि आवश्यक नहीं है।

उदाहरण: (मुझे पता है कि इन NSDates का प्रतिनिधित्व नहीं करते, ये सिर्फ उदाहरण के लिए कर रहे हैं)

इनपुट: STARTDATE = 6/23/10 20:11:30 ENDDATE = 6/27/10 02:15:00

उत्पादन: 6/23/10, 6/24/10, 6/25/10, 6/26/10, 6/27/10

मैं: के NSArray काम करने में बुरा मत मानो। यह सिर्फ इतना है कि मुझे नहीं पता कि कुशल कोड बनाने के मामले में कहां से शुरू करना है, बिना किसी छोटे से एनएसडीएट्स के कदम उठाने के लिए।

उत्तर

5

प्रारंभ तिथि तक 24 घंटे जोड़ें जब तक कि आप अंतिम तिथि से पहले नहीं जाते।

for (nextDate = startDate ; [nextDate compare:endDate] < 0 ; nextDate = [nextDate addTimeInterval:24*60*60]) { 
    // use date 
} 

आप पाश शुरू करने अगर आप दिन के समय के बारे में परवाह से पहले दोपहर या आधी रात को पहली तारीख दौर हो सकता है।

+2

मैंने "तुलना करें:" के बजाय "समय अंतराल सेन्सडेट:" का उपयोग किया क्योंकि समय से अंतराल सेन्सडेट एक संख्यात्मक मान देता है, हालांकि तुलना भी काम करती है। इसके अतिरिक्त, "timeIntervalSinceDate" को बहिष्कृत किया गया है, इसलिए मैंने "dateByAddingTimeInterval:" मैंने ऐसा कुछ करने का विचार किया, लेकिन मुझे नहीं पता था कि मैं इस तरह के लूप के लिए प्रारूपित कर सकता हूं। धन्यवाद! –

+0

ऐडटाइम इंटरवल: आईओएस 4 के बाद से हटा दिया गया है। –

+0

यह उन दिनों के साथ अच्छा नहीं खेलता है जिनके पास डेलाइट बचत समय के कारण अलग-अलग घंटे हैं। –

9

अपने प्रारंभ, एक NSDateComponents उदाहरण में NSDate उदाहरण परिवर्तित NSDateComponents के लिए 1 दिन जोड़ सकते हैं और NSCalendar का उपयोग करें कि वापस एक NSDate उदाहरण में कन्वर्ट करने के लिए एक NSCalendar उदाहरण का प्रयोग करें। जब तक आप अपनी समाप्ति तिथि तक नहीं पहुंच जाते, तब तक अंतिम दो चरणों को दोहराएं।

+0

यह भी काम करता है, लेकिन खींचा गया समाधान से थोड़ा गड़बड़ है। –

+4

Messier? नहीं। अधिक सही? हाँ। ड्रैगनोनवर्ड का समाधान किसी भी मुद्दे को ध्यान में रखता है जो कैलेंडर विशिष्टताओं, जैसे कि डेलाइट सेविंग टाइम इत्यादि के कारण पॉप अप हो सकता है। 'एनएससीएंडेंडर' का उपयोग करके निश्चित रूप से ऐप्पल अनुशंसित तरीका है। –

+0

अनुक्रमिक दिनों के लिए एनएससीएंडेंडर ओवरकिल है। दोपहर की शुरुआत की तारीख को डेलाइट बचत शामिल है। तथ्य यह है कि दिन 24 घंटे से दूसरे दिन हो सकते हैं, इससे कोई फर्क नहीं पड़ता जब तक आप 30000 लीप सेकेंड के माध्यम से फिर से नहीं जाते हैं और केवल 24 ही होते हैं। लीप दिन 24 घंटे होते हैं। एनएससीएंडर का उपयोग करना एक साधारण कार्य को अनावश्यक जटिलता जोड़ता है। – drawnonward

2

ओएस एक्स 10.9 और आईओएस 8.0 के बाद से ऐसा करने के लिए निम्नलिखित बहुत साफ तरीका है। यह महीने के अंतराल के अंत से भी निपटता है।

let cal = NSCalendar.currentCalendar() 
let start = NSDate() 
let end = // some end date 

var next = start 
while !cal.isDate(next, inSameDayAsDate: end) { 
    next = cal.dateByAddingUnit(.Day, value: 1, toDate: next, options: [])! 
    // do something with `next` 
} 

पुराने OS संस्करण के लिए -isDate:inSameDayAsDate: कुछ कॉल द्वारा बदला जा सकता है ध्यान दें कि उदा -components:fromDate:toDate:options: और -dateByAddingUnit:value:toDate:options: को dateByAddingComponents:toDate:options: द्वारा प्रतिस्थापित किया जा सकता है।

संबंधित मुद्दे