web-dev-qa-db-fra.com

NSDate d'hier

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.

40
Marcus

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.

69
Rob

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())
23
Ben

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
}
2
ZaEeM ZaFaR

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:

  • Opération mathématique avec dates: (1.years - 2.hours + 16.minutes).fromNow()
  • Composer les composants de temps: let dateInUTC = (2015.years | 12.months | 25.days | 20.hours | 10.minutes).inUTCRegion
  • Chic: let date = 5.days.fromNow, let date = 4.hours.ago
  • Avec les régions: let date = (6.hours + 2.minutes).fromNow(region: inRome)
  • Et beaucoup plus ...

J'espère que ça aide.

2
Javier Cadiz