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,这真的有助于回答这个问题,你就会得到赏金。
只要确保fromDate
和toDate
(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的主要内容,如果未能解决你的问题,请参考以下文章