我正在制作一个闹钟,它会告诉你你有多少小时和几分钟的睡眠时间。我设置了UIDatePicker
,用户选择他们想要醒来的时间。它还告诉了第二个确切的时间。我坚持的部分是他们将要睡多少小时。我试过基本上从UIDatePicker
中减去确切的时间。如果它们都在AM中,这就有效。例如,如果用户想要在上午10:30醒来并且是上午9:30,那么您所要做的就是从9:30减去10:30以获得1小时。我很快意识到,如果他们是不同的时间,这将无法工作,例如上午或下午。
我如何从UIDatePicker获得时间
func handler(sender: UIDatePicker) {
var timeFormatter = NSDateFormatter()
timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
var strDate = timeFormatter.stringFromDate(theDatePicker.date)
}
theDatePicker.addTarget(self, action: Selector("handler:"), forControlEvents: UIControlEvents.ValueChanged)
我如何得到确切的时间
var date = NSDate()
var outputFormat = NSDateFormatter()
outputFormat.locale = NSLocale(localeIdentifier:"en_US")
outputFormat.dateFormat = "HH:mm:ss"
timeLabel.text = (outputFormat.stringFromDate(date))
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("getTime"), userInfo: nil, repeats: true)
我的问题:
如何从准确的时间中减去UIDatePicker
以获得用户获得的睡眠时间?
答案 0 :(得分:12)
您可以使用NSCalendar
方法components:fromDate:toDate:options:
,例如:
@IBAction func valueChangedForPicker(sender: UIDatePicker) {
let now = NSDate()
let wakeUpTime = sender.date
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit, fromDate: now, toDate: wakeUpTime, options: nil)
println(String(format: "%02d:%02d:%02d", components.hour, components.minute, components.second))
}
如果您收到负值,那是因为fromDate
不在toDate
之前。在这种情况下,如果您仅在时间内处理NSDatePicker
,则可能需要调整wakeUpTime
的时间以确保它在将来。
var wakeUpTime = datePicker.date
if wakeUpTime.compare(now) == .OrderedAscending {
wakeUpTime = calendar.dateByAddingUnit(.DayCalendarUnit, value: 1, toDate: wakeUpTime, options: nil)!
}
答案 1 :(得分:5)
以下是Swift游乐场的一个例子:
// Setting up a date since I don't have a UIDatePicker
let dateString = "2014-11-12 07:25"
let dateFormatter: NSDateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm"
var wakeupTime: NSDate = dateFormatter.dateFromString(dateString)!
// var wakeupTime: NSDate = theDatePicker.date
let fromDate = NSDate()
let gregorianCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
let flags: NSCalendarUnit = .HourCalendarUnit | .MinuteCalendarUnit
let components = gregorianCalendar.components(flags, fromDate: fromDate, toDate: wakeupTime, options: NSCalendarOptions(0))
println("\(components.hour) hours, \(components.minute) minutes")