你的陈述
上述方法的问题是只能设置一个单位
时间...
不正确。 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)!
// Swift 1.2:
let components = cal.components(.CalendarUnitDay | .CalendarUnitMonth | .CalendarUnitYear, fromDate: date)
// Swift 2:
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?
// Swift 1.2:
cal.rangeOfUnit(.CalendarUnitDay, startDate: &newDate, interval: nil, forDate: date)
// Swift 2:
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)