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