昨天的NSDate

如何创build一个自定义date而不是当前date的NSDate对象? 例如,我想创build一个昨天或2天前的变种。

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

 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: []) 

或者获取本月的第一个月份,可以从当前date获取日,月和年,将date调整为月份的第一个月份,然后创build一个新的date对象。 在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类中有很多有用的function,所以你应该进一步调查。 有关更多信息,请参阅NSCalendar类参考 。

但是我build议不要通过调整date对象的手动调整,而是按照每天秒数的倍数(例如24 * 60 * 60)进行调整。 如果你只是增加了一些时间间隔,那么这种技术就可以正常工作,但是对于date计算,你真的想要使用日历对象,以避免夏令时等问题。

这是Swift 4 – XCode 9的解决scheme

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

罗布的答案很好。 如果你正在大量使用这种计算,你甚至可以封装这个逻辑,并制作你自己的定制扩展和包装。

这就是说,我会build议看看这个名为SwiftDate的奇妙图书馆。 即使你不使用它,README值得阅读。 它介绍了对某些场景和一些方便的初始化程序可以超级有用的定义或Region

一些很酷的东西和样本:

  • math运算与date: (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)
  • 还有更多…

希望能帮助到你。

代码为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 } 
 let twoDaysAgo = NSDate(timeIntervalSinceNow: -2*24*60*60) 

请尝试下面的代码。 我觉得很简单

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

干杯!!!