Comment créer un objet swift Date

Comment créer un objet date, à partir d'une date dans swift xcode.

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

102
demandé sur gbk 2014-06-07 00:18:00

8 réponses

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

Création D'une Date et D'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 depuis la date de référence du 1er janvier 2001 à 00:00:00 UTC . Ceci est exprimé dans le Date structure . Ce qui suit vous donnera la date et l'heure actuelles:

let currentDateTime = Date()

Pour créer d'autres dates-heures, vous pouvez utiliser méthodes suivantes.

Méthode 1

Si vous connaissez le nombre de secondes avant ou après la date de référence 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 choses comme des années, des mois, des jours et des heures (plutôt que des secondes relatives) pour faire un Date. Pour cela, vous pouvez utiliser DateComponents pour spécifier les composants, puis Calendar pour créer de la date. Le Calendar donne le contexte Date. Autrement, comment pourrait-il savoir ce que fuseau horaire ou calendrier pour 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 fuseau horaire peuvent être trouvées ici . Si vous laissez ce champ vide, la valeur par défaut est d'utiliser le fuseau horaire de l'utilisateur.

Méthode 3

La façon 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.

Notes

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

148
répondu Suragch 2017-12-06 04:33:41

Il est préférable d'utiliser 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 actuels en utilisant la chaîne de date dans le format que vous avez 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)
    }
 }

Maintenant, vous pouvez 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 performance si vous prévoyez de créer de nombreux NSDate s dans ce façon.

Veuillez également noter que cette implémentation va simplement planter si vous essayez d'initialiser un NSDate en passant une chaîne qui ne peut pas être analysée correctement. Ceci est dû au déballage forcé de la valeur optionnelle renvoyée par dateFromString. Si vous vouliez renvoyer un nil sur de mauvaises analyses, vous utiliseriez idéalement un initialiseur failible; mais vous ne pouvez pas le faire maintenant (juin 2015), en raison d'une limitation dans Swift 1.2, alors vous êtes le meilleur choix est d'utiliser une méthode d'usine de classe.

Un plus exemple élaboré, qui traite des deux questions, est ici: https://gist.github.com/algal/09b08515460b7bd229fa .

107
répondu algal 2015-06-22 20:47:26

Swift n'a pas son propre type de Date, mais vous devez utiliser le type Cocoa NSDate existant, 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)
43
répondu mythz 2016-12-05 22:29:44

Selon documentation Apple

Exemple :

var myObject = NSDate()
let futureDate = myObject.dateByAddingTimeInterval(10)
let timeSinceNow = myObject.timeIntervalSinceNow
4
répondu thedjnivek 2014-06-06 20:26:56

Dans, Swift 3.0, vous avez défini l'objet date pour cette façon.

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)
    }
}
3
répondu Jaydip 2017-03-08 08:07:08

Personnellement, je pense que ce devrait être un initialiseur failable:

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
répondu Leon 2017-03-24 10:18:55

Selon la réponse de @ mythz, 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
répondu Hamsternik 2017-05-23 17:18:38

J'ai souvent besoin de combiner des valeurs de date d'un endroit 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
répondu Justin Domnitz 2015-08-18 14:31:31