2008-10-08 24 views
12

क्या ऐसा करने का कोई बेहतर तरीका है?क्या आधी रात को खोजने का कोई बेहतर तरीका है?

-(NSDate *)getMidnightTommorow { 
    NSCalendarDate *now = [NSCalendarDate date]; 
    NSCalendarDate *tomorrow = [now dateByAddingYears:0 months:0 days:1 hours:0 minutes:0 seconds:0]; 
    return [NSCalendarDate dateWithYear:[tomorrow yearOfCommonEra] 
            month:[tomorrow monthOfYear] 
            day:[tomorrow dayOfMonth] 
            hour:0 
           minute:0 
           second:0 
           timeZone:[tomorrow timeZone]]; 
} 

ध्यान दें कि मैं हमेशा अगले आधी रात चाहते हैं, भले ही वह जब मुझे लगता है कि कॉल करने के आधी रात होने वाला, लेकिन यह 23:59:59 होता है, मैं निश्चित रूप से आधी रात कि आ रहा है चाहते हैं एक सेकंड में

प्राकृतिक भाषा कार्य flaky प्रतीत होता है, और मुझे यकीन नहीं है कि अगर मैं "दिन" क्षेत्र में 32 पास करता हूं तो कोको क्या करेगा। documentation से

उत्तर

25

: (कॉल यदि वह काम करता हूँ मैं [... अब dateByAddingYears] छोड़ सकता है):

NSCalendarDate की

उपयोग सशक्त हतोत्साहित किया। यह पदावनत नहीं है अभी तक, लेकिन यह बाद Mac OS X v10.5 अगला बड़ा ओएस रिलीज में हो सकता है। पंचांग गणना के लिए, आप NSCalendar, NSDate, और NSDateComponents की उपयुक्त संयोजन का उपयोग करना चाहिए, Dates and Times Programming Topics for Cocoa में कैलेंडर में वर्णित है।

कि सलाह के बाद:

NSDate *today = [NSDate date]; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.day = 1; 
NSDate *tomorrow = [gregorian dateByAddingComponents:components toDate:today options:0]; 
[components release]; 

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
components = [gregorian components:unitFlags fromDate:tomorrow]; 
components.hour = 0; 
components.minute = 0; 

NSDate *tomorrowMidnight = [gregorian dateFromComponents:components]; 

[gregorian release]; 
[components release]; 

(मुझे यकीन है कि नहीं बेतकल्लुफ़ अगर यह सबसे कारगर कार्यान्वयन है हूँ, लेकिन यह सही दिशा में एक सूचक के रूप में काम करना चाहिए।)

नोट : सिद्धांत रूप में आप घटक के लिए सामान्य मानों की सीमा से अधिक मूल्यों के साथ डेट घटकों ऑब्जेक्ट को अनुमति देकर यहां कोड की मात्रा को कम कर सकते हैं (उदाहरण के लिए दिन घटक में केवल 1 जोड़ना, जिसके परिणामस्वरूप 32 का मान हो सकता है) । हालांकि, हालांकि dateFromComponents: बर्दाश्त कर सकते हैं बाहर के सीमा मूल्यों, यह करने के लिए गारंटी नहीं है। आपको दृढ़ता से प्रोत्साहित किया जाता है कि इस पर भरोसा न करें।

+0

और उस से निम्नलिखित:

NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setDay:1]; NSDate *tomorrow = [calendar dateByAddingComponents:comps toDate:[NSDate date] options:0]; //it gives us tomorrow with current time NSDate *midnight = [calendar startOfDayForDate:tomorrow]; //here we get next midnight 

यह भी अगर एक NSTimer की स्थापना करने की जरूरत सेकंड अंतराल को पुनः प्राप्त करने के लिए आसान है सूचक, ऐसा लगता है कि मैं उस तारीख के रूप में अधिकतर कटौती कर सकता हूं FromComponents * करता है * महीने के अंत से पहले दिन बर्दाश्त करता प्रतीत होता है। – Dre

+0

dateFromComponents * * सीमा से बाहर मूल्यों को सहन कर सकता है, लेकिन इसकी गारंटी नहीं है। आपको दृढ़ता से प्रोत्साहित किया जाता है कि उस पर भरोसा न करें। – mmalc

+0

मैं पूर्वी तट पर हूँ, और सारा दिन आज जब मैं ऊपर रूपांतरण मैं 1 मिलता है (मेरे समय offet है -5 घंटे, लेकिन ऐसा लगता है कि NSCalendar आश्वस्त है कि यह है -4 घंटे। (यहां तक ​​कि मैं स्पष्ट रूप से अगर समय क्षेत्र) –

0

अपनी वर्तमान दिनांक और समय को यूनिक्स तिथि (1 9 70 से सेकंड) या डॉस शैली (1 9 80 से) में कनवर्ट करें, फिर 24 घंटे जोड़ें और इसे वापस परिवर्तित करें। फिर आधी रात को पाने के लिए घंटे, मिनट और सेकंड शून्य पर रीसेट करें।

+0

कुछ डेलाइट सेविंग बढ़त मामलों के लिए सही काम नहीं करता है। – Andrew

7

नहीं - यह वही तरीका होगा जिसका उपयोग आप आधी रात को खोजने के लिए करते हैं।

+0

awww c'mon। वह हास्यास्पद था! – loudej

+1

मुझे डर है कि यहां लोगों को बहुत ही दोषपूर्ण विडंबना/हास्य डिटेक्टर हैं। यदि आप अपनी मजेदार टिप्पणियों को इस तरह चिह्नित नहीं करते हैं, तो आप नीचे आ जाएंगे। BTDT। – JesperE

+0

मैं आपके उत्तर को कम नहीं करूँगा, लेकिन यह भी मानना ​​कि यह मजाकिया था, मजाक क्या है? एक झुकाव संक्षिप्त जवाब जो प्रश्न के विवरण को अनदेखा करता है? आप SO पर प्रत्येक तकनीकी प्रश्न के लिए अपने "मजाक" का उपयोग कर सकते हैं। यही कारण है कि यह मजाकिया नहीं है। –

1
[NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; 
+0

दिलचस्प दृष्टिकोण (और मैंने इसके लिए इसे ऊपर रखा), लेकिन दस्तावेज़ीकरण में सावधानी बरतें: "यह अप्रत्याशित परिणाम दे सकता है, और इसका उपयोग दृढ़ता से निराश हो जाता है।" –

+0

धन्यवाद, मैं आईफोन एसडीके के बाद भी एक बेहतर समाधान की तलाश में था जब मैं इसका उपयोग करता हूं तो पसंद नहीं करता है, लेकिन यह अभी भी काम करता है :) – user58338

4
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 

NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:(24 * 60 * 60)]; 

NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | 
                 NSMonthCalendarUnit | 
                 NSDayCalendarUnit) 
              fromDate:tomorrow]; 

NSDate *midnight = [gregorian dateFromComponents:components]; 
+6

हर बार एक प्रोग्रामर 60 * 60 * 24 के रूप में एक दिन को परिभाषित करता है, एक लीप दूसरा मर जाता है। ऐसा मत करो। – cbowns

0

आप इस तरह की कोशिश कर सकते:

double intervalToMidnight = midnight.timeIntervalSinceNow; 
संबंधित मुद्दे