你的陈述
上述方法的问题在于,你只能设置一种时间单位...
是不正确的。 NSCalendarUnit
符合 RawOptionSetType
协议,
该协议继承自 BitwiseOperationsType
。这意味着可以使用 &
和 |
进行按位组合。
在 Swift 2(Xcode 7) 中,这又被更改为 OptionSetType
,
它提供了类似于集合的接口,例如请参见Error combining NSCalendarUnit with OR (pipe) in Swift 2.0.
因此,以下代码可在 iOS 7 和 iOS 8 中编译并正常工作:
let date = NSDate()
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let components = cal.components(.CalendarUnitDay | .CalendarUnitMonth | .CalendarUnitYear, fromDate: date)
let components = cal.components([.Day , .Month, .Year ], fromDate: date)
let newDate = cal.dateFromComponents(components)
(请注意,我已省略了变量的类型注释,Swift编译器会自动从赋值语句右侧的表达式中推断出类型。)
确定给定日期(午夜)的开始时间也可以使用
rangeOfUnit()
方法来完成(适用于iOS 7和iOS 8):
let date = NSDate()
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
var newDate : NSDate?
cal.rangeOfUnit(.CalendarUnitDay, startDate: &newDate, interval: nil, forDate: date)
cal.rangeOfUnit(.Day, startDate: &newDate, interval: nil, forDate: date)
如果您的部署目标是iOS 8,则更加简单:
let date = NSDate()
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let newDate = cal.startOfDayForDate(date)
更新至Swift 3(Xcode 8):
let date = Date()
let cal = Calendar(identifier: .gregorian)
let newDate = cal.startOfDay(for: date)
startOfDayForDate:
方法虽然在头文件中公开了,但没有文档记录,与许多其他未记录的新方法一起。感谢您的提醒。 - DesdenovaNSCalendar
文档确实不是最新的。 - Martin RdateBySettingHour
方法也是如此。 - AstroCB