Как создать объект swift Date


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

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

8 102

8 ответов:

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 поддерживает.

Примечания

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

это лучше всего сделать с помощью расширения к существующему 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, что вы можете сделать по соображениям производительности, если вы ожидаете быть создание многих NSDates таким образом.

пожалуйста, Также обратите внимание, что эта реализация просто рухнет, если вы попытаетесь инициализировать NSDate путем передачи строки, которая не может быть правильно проанализирована. Это происходит из-за принудительного разворачивания необязательного значения, возвращаемого dateFromString. Если вы хотите вернуть nil на плохих разборах, вы бы идеально использовать отказоустойчивый инициализатор; но вы не можете сделать это сейчас (июнь 2015), из-за ограничения в Swift 1.2, так что вы следующий лучший выбор чтобы использовать метод фабрики класса.

более подробный пример, который касается обеих проблем, находится здесь:https://gist.github.com/algal/09b08515460b7bd229fa .

Swift не имеет своего собственного типа даты, но вы можете использовать существующий 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)

по данным документация Apple

пример :

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

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

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

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

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

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

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

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