Как создать быстрый объект Date

Как создать объект даты с даты в быстром xcode.

например, в javascript, который вы бы сделали:   var day = new Date('2014-05-20');

Ответ 1

Swift имеет собственный тип Date. Не нужно использовать NSDate.

Создание даты и времени в Swift

В Swift даты и время хранятся в 64-битовом номере с плавающей запятой, измеряющем количество секунд с контрольной даты 1 января 2001 года в 00:00:00 UTC. Это выражается в структуре Date. Следующее предоставит вам текущую дату и время:

let currentDateTime = Date()

Для создания других дат-времени вы можете использовать один из следующих способов.

Метод 1

Если вам известно количество секунд до или после контрольной даты 2001 года, вы можете использовать это.

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

Метод 2

Конечно, было бы проще использовать такие вещи, как годы, месяцы, дни и часы (а не относительные секунды), чтобы сделать Date. Для этого вы можете использовать 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.current // user calendar
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.

Примечания

Посмотрите мой полный ответ о том, как отображать дату и время в читаемом формате. Также прочитайте эти превосходные статьи:

Ответ 2

Лучше всего это сделать с помощью расширения существующего класса 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 г.) из-за ограничений в 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)
    }
}

Ответ 3

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)

Ответ 4

Вот как я это сделал в 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)

Ответ 5

Согласно документация Apple

Пример:

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

Ответ 6

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

Ответ 7

Лично я думаю, что это должен быть неудачный инициализатор:

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

В противном случае строка с недопустимым форматом вызовет исключение.

Ответ 8

В соответствии с ответом @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, но если кому-то это нужно, я обновлю этот пост.

Ответ 9

Мне часто приходится комбинировать значения даты из одного места со значениями времени для другого. Я написал вспомогательную функцию, чтобы выполнить это.

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