如何设置现有的NSDate时间?

Gre*_*reg 26 objective-c nsdate nscalendar nsdatecomponents

如何设置现有NSDate的时间?

那就是我有一个约会(比如说当前日期/时间),但是想把它设置为特定的时间(例如11.23am).在目标C中最快的方法是什么?

我在看NSCalendar,看的方法,如dateByAddingComponents:toDate:options:,和dateFromComponents:,但这些似乎并没有很切中要害了什么,我需要在这里.例如:

  1. dateFromComponents: - 我必须解决所有这些工作的组件,这似乎有点矫枉过正
  2. dateByAddingComponents:toDate:options: - 我不想在我的情况下添加,而是"设置"时间.

Ale*_*ers 71

NSDate *date = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date];
[components setHour: 7];
[components setMinute: 59];
[components setSecond: 17];

NSDate *newDate = [gregorian dateFromComponents: components];
Run Code Online (Sandbox Code Playgroud)

我使用NSUIntegerMax而不是特定的OR组合位掩码,因为它更容易,但如果你想指定接收哪些数据组件,请成为我的访客.


Cli*_*udo 11

iOS 7注意:我将这个问题放在其中一些问题中,因为使用NSUIntegerMax似乎不再适用于iOS7,使用它会让我追尾约3个小时.我刚刚发现,当我使用时NSUIntegerMax,NSDateComponents忽略了设定年份.所以例如这不会改变年份:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
Run Code Online (Sandbox Code Playgroud)

这样做:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger timeComps = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit);
NSDateComponents *comps = [gregorian components:timeComps fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];
Run Code Online (Sandbox Code Playgroud)

它可能是一个iOS7错误,也可能是使用NSUIntegerMax工作是一个不再有效的侥幸.我将提交错误报告并获得明确的答案.

无论如何,如果你想避免意想不到的后果,请指定所有其他组件,否则你可能会追逐你的尾巴!


And*_*ber 8

Swift 2.0版本如何将给定日期设置为上午8点

extension NSDate {

func setTo8AM() -> NSDate {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
    components.hour = 8
    return calendar.dateFromComponents(components)!
}

}
Run Code Online (Sandbox Code Playgroud)