你的陈述
上述方法的问题是只能设置一个单位
时间 ...
是不正确的。NSCalendarUnit
符合RawOptionSetType
协议其中
继承自BitwiseOperationsType
。这意味着选项可以按位
结合&
and |
.
In 斯威夫特 2 (Xcode 7)这又被改为
一个OptionSetType
它提供了一个类似集合的界面,请参见
例如在 Swift 2.0 中将 NSCalendarUnit 与 OR(管道)组合时出错 https://stackoverflow.com/questions/32381664/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)
If如果你的部署目标是 iOS 8 那么就更简单了:
let date = NSDate()
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let newDate = cal.startOfDayForDate(date)
更新为斯威夫特 3(Xcode 8):
let date = Date()
let cal = Calendar(identifier: .gregorian)
let newDate = cal.startOfDay(for: date)