【问题标题】:how do I set an existing NSDate's time?如何设置现有 NSDate 的时间?
【发布时间】:2011-07-18 12:54:26
【问题描述】:

如何设置现有NSDate 的时间?

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

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

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

【问题讨论】:

    标签: objective-c nsdate nscalendar nsdatecomponents


    【解决方案1】:
    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 组合位掩码,因为它更容易,但如果您想指定接收哪些数据组件,请成为我的客人。

    【讨论】:

    【解决方案2】:

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

    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 工作是侥幸,不再工作。我会提交一份错误报告并得到明确的答复。

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    【解决方案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);
    

    【讨论】:

    • 如何在目标 c 的 scheduletimeinterval 方法中放置这个日期而不是计时器
    【解决方案5】:

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

    【讨论】:

    【解决方案6】:

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

    【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多