【问题标题】:NSDate of yesterday昨天的NSD
【发布时间】:2014-11-15 03:15:11
【问题描述】:

如何创建一个自定义日期而非当前日期的NSDate 对象?例如,我想创建一个昨天或 2 天前的 var。

【问题讨论】:

    标签: swift nsdate


    【解决方案1】:

    您应该使用NSCalendar 来计算日期。例如,在 Swift 3 中,今天前两天的日期是:

    let calendar = Calendar.current
    let twoDaysAgo = calendar.date(byAdding: .day, value: -2, to: Date())
    

    或者在 Swift 2 中:

    let calendar = NSCalendar.currentCalendar()
    let twoDaysAgo = calendar.dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: [])
    

    或者要获取月份的第一天,可以从当前日期获取日、月、年,将天调整为月份的第一天,然后创建一个新的日期对象。在 Swift 3 中:

    var components = calendar.dateComponents([.year, .month, .day], from: Date())
    components.day = 1
    let firstOfMonth = calendar.date(from: components)]
    

    或者在 Swift 2 中:

    let components = calendar.components([.Year, .Month, .Day], fromDate: NSDate())
    components.day = 1
    let firstOfMonth = calendar.dateFromComponents(components)
    

    NSCalendar/Calendar 类中有很多有用的函数,因此您应该进一步研究。请参阅NSCalendar class reference 了解更多信息。

    但我建议不要对日期对象进行任何手动调整,方法是将其调整为每天秒数的倍数(例如 24*60*60)。如果您只是添加一些时间间隔,该技术可以正常工作,但对于日期计算,您确实希望使用日历对象,以避免因夏令时等引起的问题。

    【讨论】:

    • DayCalendarUnit 在 OS X v10.10 中已弃用。
    • 你应该把它改成 .CalendarUnitDay
    • 让 twoDaysAgo = NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: -2, toDate: NSDate(), options: nil)
    • 显然不能为选项做 nil,至少现在不再是 swift 2.1。
    • @Patrick - 或者只是calendar.date(byAdding: .day, value: -2, to: Date())
    【解决方案2】:

    这是 Swift 5.1 - XCode 11

    的解决方案
    let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())
    

    据此两天前:

    let twoDaysAgo = Calendar.current.date(byAdding: .day, value: -2, to: Date())
    

    【讨论】:

    • 请用Calendar替换NSCalendar
    【解决方案3】:

    Rob 的回答效果很好。如果您大量使用这种计算,您甚至可以封装该逻辑并制作您自己的自定义扩展和包装器。

    也就是说,我建议也看看这个名为 SwiftDate 的奇妙库。即使您不使用它,README 也值得一读。 它介绍了定义或Region,这对于某些场景和一些方便的初始化程序非常有用。

    一些很酷的东西和样本:

    • 带日期的数学运算:(1.years - 2.hours + 16.minutes).fromNow()
    • 组成时间组件:let dateInUTC = (2015.years | 12.months | 25.days | 20.hours | 10.minutes).inUTCRegion
    • 优雅:let date = 5.days.fromNowlet date = 4.hours.ago
    • 区域:let date = (6.hours + 2.minutes).fromNow(region: inRome)
    • 还有更多...

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      Swift 2.0 代码

      static func yesterDay() -> NSDate {
      
          let today: NSDate = NSDate()
      
          let daysToAdd:Int = -1
      
          // Set up date components
          let dateComponents: NSDateComponents = NSDateComponents()
          dateComponents.day = daysToAdd
      
          // Create a calendar
          let gregorianCalendar: NSCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
          let yesterDayDate: NSDate = gregorianCalendar.dateByAddingComponents(dateComponents, toDate: today, options:NSCalendarOptions(rawValue: 0))!
      
          return yesterDayDate
      }
      

      【讨论】:

        【解决方案5】:
        let twoDaysAgo = NSDate(timeIntervalSinceNow: -2*24*60*60)
        

        【讨论】:

        • 很公平,尤其是对于比天更复杂的间隔。
        • 此解决方案不考虑夏令时。
        • @Andriy,是的,正如@Rob 在删除后的评论中指出的那样。不过,这取决于您需要NSDate 来做什么。有时像上面这样简单的事情就可以了,有时基于NSCalendar 的解决方案也不太正确:“两天前”可能表示也可能不表示“前天完全相同的时钟时间”。
        【解决方案6】:

        请尝试以下代码。我认为这很简单。

        let today = NSDate()
        let tomorrow = today.dateByAddingTimeInterval(24 * 60 * 60)
        let yesterday = today.dateByAddingTimeInterval(-24 * 60 * 60)
        

        干杯!!!

        【讨论】:

          猜你喜欢
          • 2016-05-28
          • 1970-01-01
          • 2013-08-08
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          • 1970-01-01
          相关资源
          最近更新 更多