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'.
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.
let date = Calendar.current.date(bySettingHour: 9, minute: 30, second: 0, of: Date())!
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.
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)
}
}