2011-09-02 67 views
7

我想我需要的時間設定的NSDate時間:分:秒 目前即時通訊與NSDate的組件工作,但它沒有給出期望的結果如何在NSDate上設置時間?

[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 TesInsta [26792:4444831] *** - [__ NSCFCalendar組件:fromDate:]:日期不能爲零 未來異常。 這些錯誤中的一部分將與此投訴一起報告,那麼進一步違規將被忽略。 下面是此次發生的回溯(由於編譯器優化,可能會丟失一些幀): ( –

+0

)Downvote看起來有點苛刻,因爲這個答案在三年半前發佈時效果很好。這個例外從上面的答案或從您的代碼?根據你報告的,看看這裏: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

在你的類別'dateWithHour:分鐘:第二''日曆'來自哪裏? –

+0

@ Lukasz'Severiaan'Grela這是一個'[NSCalendar currentCalendar]'變量被排除在代碼之外了 – memmons

+1

這是否適用於24h格式和AM/PM格式?例如,如果我這樣調用函數:NSDate * newDate = [someDate dateWithHour:6 minute:30 second:00];那麼「6」是6AM或6PM?顯然,如果我在6點6點的24h格式。 – 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) 
    } 
}