2011-09-02 17 views
7

मैं अपने वांछित घंटे साथ NSDate समय सेट करना चाहते सेकंड वर्तमान में NSDate घटक के साथ काम कर रहे im लेकिन यह वांछित परिणामएनएसडीएटी पर समय कैसे सेट करें? मिनट:

[comps setHour: -hours]; 
[comps setMinute:0]; 
[comps setSecond:0]; 
NSDate *minDate = [calendar_c dateFromComponents:comps]; 
+0

NSDate समय में एक असली तारीख प्रतिनिधित्व करने के लिए बनाया गया है। क्या आप वास्तविक घटकों के लिए समय घटकों को सेट करने की कोशिश कर रहे हैं? –

उत्तर

16

आपका दृष्टिकोण ठीक काम करना चाहिए न जताए। मुझे इस प्रकार की समस्या (व्यक्तिगत दिनांक घटकों को सेट करने) के लिए एक समाधान की आवश्यकता है और निम्न कोड मेरे लिए अपेक्षित काम करता है। मेरी स्थिति: मैं एक डेट ऑब्जेक्ट बनाना चाहता था जो वर्तमान तारीख का उपयोग करता था लेकिन समय के साथ एक स्ट्रिंग के रूप में पारित मूल्य पर सेट किया गया था।

NSString *string = @"7:00"; 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
NSDateFormatter *timeOnlyFormatter = [[NSDateFormatter alloc] init]; 
[timeOnlyFormatter setLocale:locale]; 
[timeOnlyFormatter setDateFormat:@"h:mm"]; 

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *today = [NSDate date]; 
NSDateComponents *todayComps = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:today]; 

NSDateComponents *comps = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[timeOnlyFormatter dateFromString:string]]; 
comps.day = todayComps.day; 
comps.month = todayComps.month; 
comps.year = todayComps.year; 
NSDate *date = [calendar dateFromComponents:comps]; 
[calendar release]; 
[timeOnlyFormatter release]; 
[locale release]; 

एक बात नोट करने के लिए क्या तुम सच में समय क्षेत्रों है जब आप एक समय सही प्रतीत होता है कि क्या पहचानने रहे हैं पर ध्यान देना होता है। उदाहरण के लिए, मेरे ऐप में, जब आप ब्रेकपॉइंट पर रुकते हैं, तो आप जीएमटी में समय देखेंगे (इसलिए यह इनपुट समय से अलग दिखता है, जो मेरे स्थानीय समय में है), लेकिन जब समय वास्तव में स्क्रीन पर प्रदर्शित होता है ऐप, इसे स्थानीय टाइमज़ोन में प्रदर्शित करने के लिए स्वरूपित किया जा रहा है। यह निर्धारित करने के लिए आपको यह विचार करने की आवश्यकता हो सकती है कि परिणाम वास्तव में आपकी अपेक्षा से अलग है।

यदि यह मदद नहीं करता है, तो क्या आप "वांछित परिणाम नहीं दे रहे" पर विस्तार कर सकते हैं? इसका क्या परिणाम है और यह आपके द्वारा अपेक्षित अपेक्षाओं की तुलना कैसे करता है?

+0

मुझे बस यह त्रुटि मिल रही है: 2015-01-16 12: 14: 05.864 टेसइंस्टा [26792: 4444831] *** - [__ एनएससीएफसीएंडर घटक: सेडेट:]: दिनांक भविष्य अपवाद नहीं हो सकता है। इस शिकायत के साथ इनमें से कुछ त्रुटियों की सूचना दी जा रही है, तो आगे के उल्लंघनों को केवल अनदेखा कर दिया जाएगा। यहां बैकट्रैक है जहां इस बार हुआ था (कुछ फ्रेम संकलक अनुकूलन के कारण गायब हो सकते हैं): ( –

+0

डाउनवोट थोड़ा कठोर लगता है कि यह जवाब प्रकाशित होने पर साढ़े तीन साल पहले काम करता था। क्या आपको मिला उपरोक्त या आपके कोड से दिए गए उत्तर से यह अपवाद? आपने जो बताया है उसके आधार पर, यहां देखें: http://stackoverflow.com/questions/16094063/sending-nscfcalendar-nil-nsdate-sarcastic-error –

20

यह NSDate श्रेणी के रूप में बहुत अच्छा काम करता है।

/** Returns a new NSDate object with the time set to the indicated hour, 
    * minute, and second. 
    * @param hour The hour to use in the new date. 
    * @param minute The number of minutes to use in the new date. 
    * @param second The number of seconds to use in the new date. 
    */ 
-(NSDate *) dateWithHour:(NSInteger)hour 
        minute:(NSInteger)minute 
        second:(NSInteger)second 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [calendar components: NSYearCalendarUnit| 
                 NSMonthCalendarUnit| 
                 NSDayCalendarUnit 
               fromDate:self]; 
    [components setHour:hour]; 
    [components setMinute:minute]; 
    [components setSecond:second]; 
    NSDate *newDate = [calendar dateFromComponents:components]; 
    return newDate; 
} 
ऊपर श्रेणी के साथ

, अगर आप आप पर समय को बदलना चाहते हैं एक मौजूदा तिथि होती है, आप इस तरह ऐसा:

NSDate *newDate = [someDate dateWithHour:10 minute:30 second:00];

अगर, हालांकि, आप जोड़ने का प्रयास कर रहे हैं या एक मौजूदा तारीख से घंटे घटाना, ऐसा करने के लिए एक वर्ग विधि भी स्पष्ट है:

/** Returns a new date with the given number of hours added or subtracted. 
    * @param hours The number of hours to add or subtract from the date. 
    */ 
-(NSDate*)dateByAddingHours:(NSInteger)hours 
{ 
    NSDateComponents *components = [[NSDateComponents alloc] init]; 
    [components setHour:hours]; 

    return [[NSCalendar currentCalendar] 
       dateByAddingComponents:components toDate:self options:0]; 
} 
+1

आपकी श्रेणी में दिनांक दिनांक दिनांक: मिनट: दूसरा' जहां 'कैलेंडर' आता है? –

+0

@ लुकाज़'विवरियान 'ग्रेला यह एक' [एनएससीएंडर वर्तमान कैलेंडर] 'चर था जो कोड से बाहर था। जोड़ा गया। – memmons

+1

यह सही 24h प्रारूप और AM/पीएम प्रारूप? उदाहरण के लिए, यदि मैं इस तरह से फ़ंक्शन को कॉल करता हूं: NSDate * newDate = [someDate dateWithHour: 6 मिनट: 30 सेकंड: 00]; "6" 6AM या 6PM है? स्पष्ट रूप से, अगर मैं 24h प्रारूप में हूं कि 6 6 बजे है। – superpuccio

0
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *comps = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]]; 
comps.hour = 0; 
comps.minute = 15; 
NSDate *date = [calendar dateFromComponents:comps]; 

iOS 8

2

Swift2

extension NSDate { 
    func dateWithHour (hour: Int, minute:Int, second:Int) ->NSDate?{ 

     let calendar = NSCalendar.currentCalendar(), 
      components = calendar.components([.Day,.Month,.Year], fromDate: self) 
     components.hour = hour; 
     components.minute = minute; 
     components.second = second; 

     return calendar.dateFromComponents(components) 
    } 
} 
संबंधित मुद्दे