Comment créer un objet NSDate
avec une date personnalisée autre que la date actuelle? Par exemple, je voudrais créer un var d'hier ou d'il y a 2 jours.
Vous devez utiliser NSCalendar
pour calculer les dates. Par exemple, en Swift 3 la date deux jours avant aujourd'hui est:
let calendar = Calendar.current
let twoDaysAgo = calendar.date(byAdding: .day, value: -2, to: Date())
Ou en Swift 2:
let calendar = NSCalendar.currentCalendar()
let twoDaysAgo = calendar.dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: [])
Ou pour obtenir le premier du mois, vous pouvez obtenir le jour, le mois et l'année à partir de la date actuelle, ajuster le jour au premier du mois, puis créer un nouvel objet de date. Dans Swift 3:
var components = calendar.dateComponents([.year, .month, .day], from: Date())
components.day = 1
let firstOfMonth = calendar.date(from: components)]
Ou en Swift 2:
let components = calendar.components([.Year, .Month, .Day], fromDate: NSDate())
components.day = 1
let firstOfMonth = calendar.dateFromComponents(components)
Il existe de nombreuses fonctions utiles dans la classe NSCalendar
/Calendar
, vous devriez donc étudier cela plus en détail. Voir référence de classe NSCalendar pour plus d'informations.
Mais je déconseille de faire des ajustements manuels des objets de date en les ajustant par un intervalle de temps qui est un multiple des secondes par jour (par exemple 24 * 60 * 60). Cette technique fonctionne bien si vous ajoutez simplement un intervalle de temps, mais pour les calculs de date, vous voulez vraiment utiliser un objet de calendrier, pour éviter les problèmes liés à l'heure d'été et autres.
Ceci est une solution pour Swift 4.2 - XCode 1
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())
Il y a donc deux jours:
let twoDaysAgo = Calendar.current.date(byAdding: .day, value: -2, to: Date())
Code pour Swift 2.0
static func yesterDay() -> NSDate {
let today: NSDate = NSDate()
let daysToAdd:Int = -1
// Set up date components
let dateComponents: NSDateComponents = NSDateComponents()
dateComponents.day = daysToAdd
// Create a calendar
let gregorianCalendar: NSCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let yesterDayDate: NSDate = gregorianCalendar.dateByAddingComponents(dateComponents, toDate: today, options:NSCalendarOptions(rawValue: 0))!
return yesterDayDate
}
La réponse de Rob fonctionne très bien. Si vous utilisez beaucoup ce type de calculs, vous pouvez même encapsuler cette logique et créer vos propres extensions et wrappers personnalisés.
Cela dit, je proposerai également de jeter un œil à cette fantastique bibliothèque appelée SwiftDate . Même si vous ne l'utilisez pas, le README mérite d'être lu. Il présente la définition ou Region
qui peut être super utile pour certains scénarios et certains initialiseurs pratiques.
Quelques trucs et échantillons sympas:
(1.years - 2.hours + 16.minutes).fromNow()
let dateInUTC = (2015.years | 12.months | 25.days | 20.hours | 10.minutes).inUTCRegion
let date = 5.days.fromNow
, let date = 4.hours.ago
let date = (6.hours + 2.minutes).fromNow(region: inRome)
J'espère que ça aide.