你如何创build一个快速的date对象

你如何从swift xcode中的date创build一个date对象。

例如在JavaScript中你会做: var day = new Date('2014-05-20');

更新了Swift 3,它有自己的Datetypes。 不需要使用NSDate

在Swift中创build一个date和时间

在Swift中,date和时间存储在一个64位浮点数中,测量自2001年1月1日UTC时间00:00:00的参考date以来的秒数。 这在Date结构中表示。 以下将给你当前的date和时间:

 let currentDateTime = Date() 

要创build其他date时间,可以使用以下方法之一。

方法1

如果您知道2001年参考date之前或之后的秒数,则可以使用该秒数。

 let someDateTime = Date(timeIntervalSinceReferenceDate: -123456789.0) // Feb 2, 1997, 10:26 AM 

方法2

当然,使用诸如年,月,日,小时(而不是相对秒)之类的东西来制作Date会更容易。 为此,您可以使用DateComponents指定组件,然后使用Calendar来创builddate。 Calendar提供Date上下文。 否则,它将如何知道要在哪个时区或日历中表示?

 // Specify date components var dateComponents = DateComponents() dateComponents.year = 1980 dateComponents.month = 7 dateComponents.day = 11 dateComponents.timeZone = TimeZone(abbreviation: "JST") // Japan Standard Time dateComponents.hour = 8 dateComponents.minute = 34 // Create date from components let userCalendar = Calendar.current // user calendar let someDateTime = userCalendar.date(from: dateComponents) 

其他时区的缩写可以在这里find。 如果你留下这个空白,那么默认是使用用户的时区。

方法3

最简洁的方式(但不一定是最好的)可以使用DateFormatter

 let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd HH:mm" let someDateTime = formatter.date(from: "2016/10/08 22:31") 

Unicode技术标准显示了DateFormatter支持的其他格式 。

笔记

查看我的完整答案 ,了解如何以可读格式显示date和时间。 另外阅读这些优秀的文章:

  • 如何在Swift 3中使用date和时间,第1部分:date,日历和DateComponents
  • 如何在Swift 3中使用date和时间,第2部分:DateFormatter
  • 如何在Swift 3中使用date和时间,第3部分:date算术

最好使用对现有NSDate类的扩展完成。

以下扩展添加了一个新的初始化程序,它将使用您指定格式的datestring在当前语言环境中创build一个date。

 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) } } 

现在你可以从Swift创build一个NSDate,只需要做一下:

 NSDate(dateString:"2014-06-06") 

请注意,这个实现不会cachingNSDateFormatter,如果您希望以这种方式创build许多NSDate ,您可能会因为性能原因而执行该操作。

另请注意,如果您尝试通过传递无法正确parsing的string来初始化NSDate ,则此实现将简单地崩溃。 这是因为强制dateFromStringdateFromString返回的可选值。 如果你想在不好的分析中返回nil ,你最好使用一个可靠的初始化程序; 但你现在不能这样做(2015年6月),因为Swift1.2的限制,所以下一个最好的select是使用类工厂方法。

解决这两个问题的更详细的例子是: https : //gist.github.com/algal/09b08515460b7bd229fa 。

Swift没有自己的datetypes,但是你使用现有的Cocoa NSDatetypes,例如:

 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) 

根据苹果文件

例如:

 var myObject = NSDate() let futureDate = myObject.dateByAddingTimeInterval(10) let timeSinceNow = myObject.timeIntervalSinceNow 

在Swift 3.0中,你已经为此设置了date对象。

 extension Date { init(dateString:String) { let dateStringFormatter = DateFormatter() dateStringFormatter.dateFormat = "yyyy-MM-dd" dateStringFormatter.locale = Locale(identifier: "en_US_POSIX") let d = dateStringFormatter.date(from: dateString)! self(timeInterval:0, since:d) } } 

我经常需要把一个地方的date值与另一个地方的时间值结合起来。 我写了一个辅助函数来完成这个任务。

 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)! 

我个人认为这应该是一个可靠的初始者:

 extension Date { init?(dateString: String) { let dateStringFormatter = DateFormatter() dateStringFormatter.dateFormat = "yyyy-MM-dd" if let d = dateStringFormatter.date(from: dateString) { self.init(timeInterval: 0, since: d) } else { return nil } } } 

否则,具有无效格式的string将引发exception。

根据@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) } } 

我不使用parse方法,但如果有人需要,我会更新这个post。