如何从swift xcode中的日期创建一个日期对象。

例如,在javascript中你可以这样做: var day = new Date('2014-05-20');


当前回答

在Swift 3.0中,您已经为此设置了日期对象。

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

其他回答

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有自己的Date类型。不需要使用NSDate。

在Swift中创建日期和时间

在Swift中,日期和时间存储在一个64位浮点数中,该浮点数测量的是从2001年1月1日00:00:00 UTC的引用日期开始的秒数。这在Date结构中表示。下面将为您提供当前日期和时间:

let currentDateTime = Date()

若要创建其他日期时间,可以使用以下方法之一。

方法1

如果您知道2001年引用日期之前或之后的秒数,则可以使用该秒数。

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

方法2

当然,使用年、月、日和小时(而不是相对的秒)来创建日期会更容易。为此,您可以使用DateComponents指定组件,然后使用Calendar创建日期。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(identifier: .gregorian) // since the components above (like year 1980) are for Gregorian
let someDateTime = userCalendar.date(from: dateComponents)

其他时区缩写可以在这里找到。如果将其保留为空,则默认为使用用户的时区。

方法3

最简洁的方法(但不一定是最好的)可能是使用DateFormatter。

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

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

笔记

关于如何以可读的格式显示日期和时间,请参阅我的完整回答。还可以阅读这些优秀的文章:

如何在Swift 3中使用日期和时间,第1部分:日期,日历和DateComponents 如何在Swift 3中使用日期和时间,第2部分:日期格式化器 如何在Swift 3中使用日期和时间,第3部分:日期算术

这最好使用现有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)
    }
}

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

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

我不使用解析方法,但如果有人需要,我会更新这篇文章。