27

如何设置现有NSDate的时间?

那就是我有一个日期(比如当前日期/时间),但是想把它设置为一个特定的时间(例如上午 11.23 点)说。在目标 C 中执行此操作的最快方法是什么?

我正在查看NSCalendar和查看诸如dateByAddingComponents:toDate:options:, 和之类的方法dateFromComponents:,但这些方法似乎并没有完全满足我在这里需要的目标。例如:

  1. dateFromComponents:- 我必须计算出所有组件才能正常工作,这似乎有点矫枉过正
  2. dateByAddingComponents:toDate:options:- 我不想在我的情况下添加,而是“设置”时间。
4

6 回答 6

73
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];

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

于 2011-03-18T23:31:03.777 回答
11

iOS 7 注意:我把这个放在其中几个问题中是因为在 iOS7 上似乎不再使用 NSUIntegerMax,并且使用它导致我追了大约 3 个小时。我刚刚发现,当我使用时NSUIntegerMax,会NSDateComponents忽略设置年份。因此,例如,这不会改变年份:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date];
[comps setYear:year];
return [gregorian dateFromComponents:comps];

而这样做:

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];

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

无论如何,如果您想避免意外后果,请指定所有其他组件,否则您可能会追尾!

于 2013-10-17T13:24:28.253 回答
8

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

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)!
}

}
于 2015-10-27T19:00:04.680 回答
4

应用此设置将时间从另一个日期设置为现有日期

NSDate *today = [NSDate date]; // from which i need only "Year" "Month" "Date"

NSCalendar *calendar = [NSCalendar currentCalendar]
NSDateComponents *dateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) fromDate:today];

NSDate *timeDate = datePicker.date; // from which i need only "Hours" "Minutes" and "Seconds"

NSDateComponents *timeComponents = [calendar components:( NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:timeDate];

            [dateComponents setHour:[timeComponents hour]];
            [dateComponents setMinute:[timeComponents minute]];
            [dateComponents setSecond:[timeComponents second]];

NSDate *newDate = [calendar dateFromComponents:dateComponents]; // New Date with My "Year" "Month" "Date" "Hours" "Minutes" and "Seconds" 

            NSLog(@"New Date: %@",newDate);
于 2012-06-06T11:00:50.823 回答
3

这是一个更通用的 Swift (v2.1.1) 扩展,它建立在 Andrew Schreiber 的有用答案之上。

extension NSDate {
    func dateWithTime(hour: Int, minute: Int, second: Int) -> NSDate? {
        let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
        let components = calendar.components(([.Day, .Month, .Year]), fromDate: self)
        components.hour = hour
        components.minute = minute
        components.second = second
        let newDate = calendar.dateFromComponents(components)
        return newDate
    }
}
于 2016-03-17T19:47:17.523 回答
1

一个快速的例子。为了我的目的,我想得到明天中午 12 点左右的日期。

var tomorrow:NSDate = NSDate().dateByAddingTimeInterval(60*60*24); //60seconds*60minutes*12hours
var gregorian:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!;
var unit : NSCalendarUnit = (NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.DayCalendarUnit|NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit);
var comps:NSDateComponents = gregorian.components(unit, fromDate: tomorrow);
comps.setValue(12, forComponent: NSCalendarUnit.HourCalendarUnit);
comps.setValue(0, forComponent: NSCalendarUnit.MinuteCalendarUnit);
var noon_tomorrow : NSDate = gregorian.dateFromComponents(comps)!;
于 2015-02-07T21:43:56.713 回答