【问题标题】:Set a current NSDate to 8AM将当前的 NSDate 设置为 8AM
【发布时间】:2015-01-11 20:57:04
【问题描述】:

我看到了一些帖子,但它们似乎有点复杂,所以想非常具体地表达我的问题,看看是否有相对更简单的方法来实现这一点。

我想在 Swift 中为 NSDate 创建一个名为 changeTimeOfDay(hour: Int) 的扩展方法,它将给定 NSDate 的时间更改为您传入的时间。

例如,如果我当前的 NSDate 变量 d 恰好是一周后,我想专门将该日期设置为早上 8 点(所以它是一周后的早上 8 点)。我已经有了一种可以将几周添加到特定日期的扩展方法,以及一种可以添加小时数的扩展方法,但在这种情况下,我想将小时数实际设置为上午 8 点。

有什么想法可以解决这个问题吗?我想支持 ios7 和 8。我对一个简单的方法有点困惑(基于我目前能找到的)。

谢谢!

【问题讨论】:

标签: ios swift ios8


【解决方案1】:

您可以创建一些扩展来帮助您从 NSDate 对象中提取日期信息,并将其与所需时间结合起来,如下所示:

extension NSDate {
    var day:   Int { return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitDay,   fromDate: self).day   }
    var month: Int { return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitMonth, fromDate: self).month }
    var year:  Int { return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitYear,  fromDate: self).year  }
    var at8am: NSDate {
        return NSCalendar.currentCalendar().dateWithEra(1, year: year, month: month, day: day, hour: 8, minute: 0, second: 0, nanosecond: 0)!
    }
}


NSDate().at8am   // "Jan 11, 2015, 8:00 AM"

您的功能存在一些问题。像这样使用它没有 self 值。您必须将此函数创建为扩展 NSDate 函数才能使用 self。您应该将组件更改为新格式。这就是你应该如何实现你的功能:

extension NSDate {
    func changeHourOfDay(hour: Int) -> NSDate {
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.CalendarUnitYear | .CalendarUnitDay | .CalendarUnitHour, fromDate: self)
        components.hour = hour
        return calendar.dateFromComponents(components)!
    }
}

NSDate().changeHourOfDay(8)  //  "Jan 11, 2015, 8:00 AM"

【讨论】:

  • 谢谢你,我很感激!或者,你觉得我上面的帖子怎么样?
  • 这两种方法各有千秋。在这里,您有几个可以在其他上下文中轻松重用的小方法。另一方面,这个 at8am 方法需要 4 次调用 currentCalendar() 和 3 次调用 components(),而另一个答案中的代码每次只需要调用一次。
  • @Martin R 感谢您提供信息。我已经用他应该使用的答案更新了答案。
  • @Martin R 我已经为他们两个计时了。第一个在我的游乐场“0.00578689575195312s”对“0.00478911399841309s”需要更长的时间。我真的应该担心吗?
【解决方案2】:
func changeHourOfDay(hour: Int) -> NSDate {
        let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
        let components: NSDateComponents = calendar.components(.YearCalendarUnit | .DayCalendarUnit | NSCalendarUnit.HourCalendarUnit, fromDate: self)
        components.hour = hour
        return calendar.dateFromComponents(components)!
    }

这就是我按照上面的链接最终做的事情。 大家觉得这样好吗?

// 你有一些问题。像这样使用它没有 self 值。您必须将此函数创建为扩展 NSDate 函数才能使用 self。您应该将组件更改为新格式。这就是你应该如何实现你的功能:

extension NSDate {
    func changeHourOfDay(hour: Int) -> NSDate {
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components(.CalendarUnitYear | .CalendarUnitDay | .CalendarUnitHour, fromDate: self)
        components.hour = hour
        return calendar.dateFromComponents(components)!
    }
}

NSDate().changeHourOfDay(8)  //  "Jan 11, 2015, 8:00 AM"

【讨论】:

  • 是的,对不起,我的意思是写它是暗示在我的扩展类中。感谢您的澄清。
猜你喜欢
  • 2011-02-06
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多