web-dev-qa-db-fra.com

Comment créer un objet Swift Date

Comment créer un objet de date à partir d'une date dans Swift xcode.

par exemple, en javascript, vous feriez: var day = new Date('2014-05-20');

122
code_cookies

Swift a son propre type Date. Pas besoin d'utiliser NSDate.

Créer une date et une heure dans Swift

Dans Swift, les dates et les heures sont stockées dans un nombre à virgule flottante de 64 bits mesurant le nombre de secondes écoulées depuis la date de référence du 1er janvier 2001 à 00:00:00 UTC . Ceci est exprimé dans la structure _ (Date) . Ce qui suit vous donnerait la date et l'heure actuelles:

let currentDateTime = Date()

Pour créer d'autres heures de date, vous pouvez utiliser l'une des méthodes suivantes.

Méthode 1

Si vous connaissez le nombre de secondes avant ou après la date de référence de 2001, vous pouvez l'utiliser.

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

Méthode 2

Bien sûr, il serait plus facile d'utiliser des éléments tels que des années, des mois, des jours et des heures (plutôt que des secondes relatives) pour créer un Date. Pour cela, vous pouvez utiliser DateComponents pour spécifier les composants, puis Calendar pour créer la date. Le Calendar donne le contexte Date. Sinon, comment pourrait-il savoir dans quel fuseau horaire ou dans quel calendrier l'exprimer?

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

D'autres abréviations de fuseaux horaires peuvent être trouvées ici . Si vous laissez ce champ vide, le fuseau horaire de l'utilisateur est utilisé par défaut.

Méthode 3

La manière la plus succincte (mais pas nécessairement la meilleure) pourrait être d’utiliser DateFormatter.

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

Les normes techniques Unicode montrent d'autres formats que DateFormatter prend en charge.

Remarques

Voir ma réponse complète pour savoir comment afficher la date et l'heure dans un format lisible. Lisez aussi ces excellents articles:

199
Suragch

Pour ce faire, utilisez une extension de la classe NSDate existante.

L'extension suivante ajoute un nouvel initialiseur qui créera une date dans les paramètres régionaux en utilisant la chaîne de date au format spécifié.

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

Vous pouvez maintenant créer un NSDate à partir de Swift simplement en faisant:

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

Veuillez noter que cette implémentation ne met pas en cache NSDateFormatter, ce que vous voudrez peut-être faire pour des raisons de performances si vous envisagez de créer de nombreux NSDates de cette manière.

Veuillez également noter que cette implémentation plantera simplement si vous essayez d’initialiser un NSDate en transmettant une chaîne qui ne peut pas être analysée correctement. Cela est dû au retrait forcé de la valeur facultative renvoyée par dateFromString. Si vous voulez retourner un nil sur des analyses syntaxiques incorrectes, vous utiliserez idéalement un initialiseur défaillant. mais vous ne pouvez pas le faire maintenant (juin 2015), en raison d'une limitation de Swift 1.2, vous devez donc utiliser une méthode de fabrique de classes.

Un exemple plus élaboré, qui aborde les deux problèmes, est ici: https://Gist.github.com/algal/09b08515460b7bd229fa .


Mise à jour pour 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)
    }
}
109
algal

Swift n'a pas son propre type de date, mais vous devez utiliser le type existant de Cocoa NSDate, par exemple:

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

Que vous pouvez utiliser comme:

var date = Date.parse("2014-05-20")
var date = Date.from(year: 2014, month: 05, day: 20)
44
mythz

Voici comment je l'ai fait dans 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
    }
}

Usage:

let marsOpportunityLaunchDate = Date.from(year: 2003, month: 07, day: 07)
7
Adrian

Selon documentation Apple

Exemple :

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

Dans, Swift 3.0, vous avez défini un objet date de cette manière.

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

Personnellement, je pense que cela devrait être un initialiseur disponible:

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

Sinon, une chaîne avec un format non valide déclenchera une exception.

2
Leon

Selon @mythz answer, je décide de publier une version mise à jour de son extension en utilisant la syntaxe 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)
    }
}

Je n'utilise pas la méthode parse, mais si quelqu'un en a besoin, je mettrai à jour ce post.

2
Hamsternik

J'ai souvent besoin de combiner des valeurs de date d'un lieu avec des valeurs de temps pour un autre. J'ai écrit une fonction d'aide pour accomplir cela.

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)!
1
Justin Domnitz