UIDatePicker 减去确切时间 - Swift

Posted

技术标签:

【中文标题】UIDatePicker 减去确切时间 - Swift【英文标题】:UIDatePicker minus the exact time - Swift 【发布时间】:2014-11-09 00:25:29 【问题描述】:

我正在制作一个闹钟,它会告诉你睡了多少小时和多少分钟。我设置了一个UIDatePicker,用户可以在其中选择他们想要起床的时间。它还告诉精确的时间到秒。我坚持的部分是他们将获得多少小时的睡眠。我基本上只是从UIDatePicker 中减去确切的时间。如果他们都在上午,这很有效。例如,如果用户想在上午 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 以获得用户的睡眠时间?

【问题讨论】:

将日期选择器更改为 24 小时格式,而不是 12 小时格式,也许吧。 @Abizern 这可能行得通,但我怎么能做到这一点是某种功能或只是增加 12 小时? 它是由你的语言环境设置的(我住在一个 24 小时制的国家,所以我看不到上午/下午)但是如果当前时间更晚,为什么不直接在下一个触发时间添加一天比闹钟时间。 @Abizern 我知道如何将秒数添加到触发时间,但您如何添加一天? NSDateComponents。根据您最近遇到的麻烦,我建议您阅读Date and Time Programming Guide。我特别推荐执行日历计算部分。 【参考方案1】:

可以使用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)!

【讨论】:

我想知道剩下的时间并显示在上面写着Xhours Xminutes的地方,那么有什么方法可以让他们获得睡眠时间吗?例如,如果我想在早上 7:30(UIDatePicker 里面有什么)醒来,现在是晚上 7:30,我需要一种方法来计算这 2 次之间的时间 以上就是这样做的。 components.hour 包含距离选择器日期/时间的小时数,components.minute 包含多少分钟等。我只是将它打印到控制台,但您可以相应地更新您的 UILabel 对象。跨度> 这正是我正在寻找的,但是,有没有办法消除负号,所以它只显示正数小时,例如如果它是 -11 小时。我希望它只有 11 小时而不是 -11 小时。在此先感谢 Rob,这真的有助于回答这个问题,你就会得到赏金。 只要确保fromDatetoDate (a) 的顺序正确; (b) toDate 确实是未来的日期。日期选择器只显示时间,如果你说“6:00am”,它可能会返回一个NSDate,即“今天早上6:00”。所以你可能想比较结果NSDate,如果它在now之前,那么你可能想增加一天,所以它变成“明天早上6:00”。请参阅修改后的答案。 每当您从日期选择器中获取日期时,您都会这样做。您需要确保您在将来查看NSDate。因此,在我的示例中,是的,我在 valueChangedForPicker 中执行此操作。【参考方案2】:

这是一个来自 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")

【讨论】:

以上是关于UIDatePicker 减去确切时间 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

两个UIDatePicker之间的不同间隔时间

从 UIDatePicker 获取日期(没有时间)

dplyr 改变分组数据而不使用确切的列名

UIDatePicker 默认返回 Null?

UIDatePicker 泄漏

保存来自 UIDatePicker 的选择