如何从swift xcode中的日期创建一个日期对象。
例如,在javascript中你可以这样做: var day = new Date('2014-05-20');
如何从swift xcode中的日期创建一个日期对象。
例如,在javascript中你可以这样做: var day = new Date('2014-05-20');
当前回答
根据苹果文档
例子:
var myObject = NSDate()
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow
其他回答
我经常需要将一个地方的日期值与另一个地方的时间值结合起来。我写了一个辅助函数来完成这个任务。
let startDateTimeComponents = NSDateComponents()
startDateTimeComponents.year = NSCalendar.currentCalendar().components(NSCalendarUnit.Year, fromDate: date).year
startDateTimeComponents.month = NSCalendar.currentCalendar().components(NSCalendarUnit.Month, fromDate: date).month
startDateTimeComponents.day = NSCalendar.currentCalendar().components(NSCalendarUnit.Day, fromDate: date).day
startDateTimeComponents.hour = NSCalendar.currentCalendar().components(NSCalendarUnit.Hour, fromDate: time).hour
startDateTimeComponents.minute = NSCalendar.currentCalendar().components(NSCalendarUnit.Minute, fromDate: time).minute
let startDateCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
combinedDateTime = startDateCalendar!.dateFromComponents(startDateTimeComponents)!
根据@mythz的回答,我决定使用swift3语法发布他的扩展的更新版本。
extension Date {
static func from(_ year: Int, _ month: Int, _ day: Int) -> Date?
{
let gregorianCalendar = Calendar(identifier: .gregorian)
let dateComponents = DateComponents(calendar: gregorianCalendar, year: year, month: month, day: day)
return gregorianCalendar.date(from: dateComponents)
}
}
我不使用解析方法,但如果有人需要,我会更新这篇文章。
这最好使用现有NSDate类的扩展来完成。
下面的扩展添加了一个新的初始化器,它将使用指定格式的日期字符串在当前地区创建一个日期。
extension NSDate
{
convenience
init(dateString:String) {
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let d = dateStringFormatter.dateFromString(dateString)!
self.init(timeInterval:0, sinceDate:d)
}
}
现在你可以创建一个NSDate从Swift只需要做:
NSDate(dateString:"2014-06-06")
请注意,这个实现不缓存NSDateFormatter,如果你希望以这种方式创建许多nsdate,出于性能考虑,你可能想这样做。
还请注意,如果你试图通过传入一个不能正确解析的字符串来初始化NSDate,这个实现将简单地崩溃。这是因为强制打开了dateFromString返回的可选值。如果你想在错误的解析上返回nil,理想情况下你会使用一个可失败的初始化式;但是现在(2015年6月)你不能这样做,因为Swift 1.2的限制,所以你的下一个最佳选择是使用类工厂方法。
这里有一个更详细的示例,可以解决这两个问题:https://gist.github.com/algal/09b08515460b7bd229fa。
Swift 5更新
extension Date {
init(_ dateString:String) {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateFormat = "yyyy-MM-dd"
dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
let date = dateStringFormatter.date(from: dateString)!
self.init(timeInterval:0, since:date)
}
}
Swift没有自己的Date类型,但是你可以使用现有的Cocoa NSDate类型,例如:
class Date {
class func from(year: Int, month: Int, day: Int) -> Date {
let gregorianCalendar = NSCalendar(calendarIdentifier: .gregorian)!
var dateComponents = DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
let date = gregorianCalendar.date(from: dateComponents)!
return date
}
class func parse(_ string: String, format: String = "yyyy-MM-dd") -> Date {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = NSTimeZone.default
dateFormatter.dateFormat = format
let date = dateFormatter.date(from: string)!
return date
}
}
你可以这样用:
var date = Date.parse("2014-05-20")
var date = Date.from(year: 2014, month: 05, day: 20)
以下是我在Swift 4.2中是如何做到的:
extension Date {
/// Create a date from specified parameters
///
/// - Parameters:
/// - year: The desired year
/// - month: The desired month
/// - day: The desired day
/// - Returns: A `Date` object
static func from(year: Int, month: Int, day: Int) -> Date? {
let calendar = Calendar(identifier: .gregorian)
var dateComponents = DateComponents()
dateComponents.year = year
dateComponents.month = month
dateComponents.day = day
return calendar.date(from: dateComponents) ?? nil
}
}
用法:
let marsOpportunityLaunchDate = Date.from(year: 2003, month: 07, day: 07)