【发布时间】:2014-11-15 03:15:11
【问题描述】:
如何创建一个自定义日期而非当前日期的NSDate 对象?例如,我想创建一个昨天或 2 天前的 var。
【问题讨论】:
如何创建一个自定义日期而非当前日期的NSDate 对象?例如,我想创建一个昨天或 2 天前的 var。
【问题讨论】:
您应该使用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)。如果您只是添加一些时间间隔,该技术可以正常工作,但对于日期计算,您确实希望使用日历对象,以避免因夏令时等引起的问题。
【讨论】:
calendar.date(byAdding: .day, value: -2, to: Date())。
这是 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
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.fromNow,let 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)
【讨论】:
NSDate 来做什么。有时像上面这样简单的事情就可以了,有时基于NSCalendar 的解决方案也不太正确:“两天前”可能表示也可能不表示“前天完全相同的时钟时间”。
请尝试以下代码。我认为这很简单。
let today = NSDate()
let tomorrow = today.dateByAddingTimeInterval(24 * 60 * 60)
let yesterday = today.dateByAddingTimeInterval(-24 * 60 * 60)
干杯!!!
【讨论】: