Objective c 如何设置现有NSDate';什么时候了?

Objective c 如何设置现有NSDate';什么时候了?,objective-c,nsdate,nscalendar,nsdatecomponents,Objective C,Nsdate,Nscalendar,Nsdatecomponents,如何设置现有的NSDate的时间 也就是说,我有一个日期(比如说当前的日期/时间),但我想将其设置为一个特定的时间(比如上午11点23分)。在目标C中,最快的方法是什么 我正在查看NSCalendar并查看诸如dateByAddingComponents:toDate:options:,和dateFromComponents:,但这些方法似乎并没有达到我在这里需要的目的。例如: dateFromComponents:-我必须计算出所有的组件才能使其正常工作,这似乎有些过分了 dateByAddi

如何设置现有的
NSDate
的时间

也就是说,我有一个日期(比如说当前的日期/时间),但我想将其设置为一个特定的时间(比如上午11点23分)。在目标C中,最快的方法是什么

我正在查看
NSCalendar
并查看诸如
dateByAddingComponents:toDate:options:
,和
dateFromComponents:
,但这些方法似乎并没有达到我在这里需要的目的。例如:

  • dateFromComponents:
    -我必须计算出所有的组件才能使其正常工作,这似乎有些过分了
  • dateByAddingComponents:toDate:options:
    -我不想在我的案例中添加,而是“设置”时间
  • 我使用
    NSUIntegerMax
    而不是特定的或组合的位掩码,因为这更简单,但如果您想指定要接收哪些数据组件,请随意使用。

    应用此选项设置从另一个日期到现有日期的时间


    iOS 7注意:我把这个问题放在其中几个问题中,因为在iOS 7上使用NSUIntegerMax似乎不再有效,使用它让我追了大约3个小时。我刚刚发现,当我使用
    nsintegermax
    时,
    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错误,也可能是因为使用integermax工作是一种侥幸,不再有效。我将提交一份bug报告并得到一个明确的答案


    不管怎样,如果你想避免意外的后果,请指定所有组件,否则你可能会追尾

    一个快速的例子。为了我的目的,我想把日期定在明天中午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)!;
    

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

    这里有一个更通用的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
        }
    }
    

    有什么帮助吗?如何在目标c中使用日期组件而不是计时器如何在目标c的
    scheduletimeinterval
    方法中使用此日期而不是计时器。如何在目标c的scheduletimeinterval方法中使用此日期代替计时器。如何在目标c的scheduletimeinterval方法中使用此日期代替计时器。如何在目标的scheduletimeinterval方法中使用此日期代替计时器?我可以在目标c的scheduletimeinterval方法中使用此日期代替计时器吗
    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)!
    }
    
    }
    
    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
        }
    }