web-dev-qa-db-fra.com

Comment changer les heures et les minutes de la journée en cours dans Swift?

Si je crée une Date() pour obtenir la date et l'heure actuelles, je souhaite créer une nouvelle date à partir de celle-ci, mais avec des heures, des minutes et des secondes différentes, quel est le moyen le plus simple de le faire en utilisant Swift? J'ai trouvé tellement d'exemples avec 'get' mais pas 'setting'.

31
u84six

Sachez que pour les paramètres régionaux qui utilisent l'heure d'été, certaines heures peuvent ne pas exister les jours de changement d'horloge ou bien elles peuvent se produire deux fois. Les deux solutions ci-dessous renvoient un Date? Et utilisent le décompressage forcé. Vous devriez gérer les possibles nil dans votre application.

Swift 3, 4 et iOS 8/OS X 10.9 ou ultérieur

let date = Calendar.current.date(bySettingHour: 9, minute: 30, second: 0, of: Date())!

Swift 2

Utilisez NSDateComponents/DateComponents:

let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let now = NSDate()
let components = gregorian.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: now)

// Change the time to 9:30:00 in your locale
components.hour = 9
components.minute = 30
components.second = 0

let date = gregorian.dateFromComponents(components)!

Notez que si vous appelez print(date), l'heure imprimée est en UTC. C'est le même moment, simplement exprimé dans un fuseau horaire différent du vôtre. Utilisez un NSDateFormatter pour le convertir en heure locale.

73
Code Different

Swift 3 extension de date avec fuseau horaire

extension Date {
    public func setTime(hour: Int, min: Int, sec: Int, timeZoneAbbrev: String = "UTC") -> Date? {
        let x: Set<Calendar.Component> = [.year, .month, .day, .hour, .minute, .second]
        let cal = Calendar.current
        var components = cal.dateComponents(x, from: self)

        components.timeZone = TimeZone(abbreviation: timeZoneAbbrev)
        components.hour = hour
        components.minute = min
        components.second = sec

        return cal.date(from: components)
    }
}
24
RiceAndBytes