obtenir NSDate aujourd’hui, hier, cette semaine, la semaine dernière, ce mois-ci, le mois dernier… variables

J’essaie de faire est d’obtenir NSDate aujourd’hui, hier, cette semaine, la semaine dernière, ce mois-ci, le mois dernier variables prêtes pour la comparaison pour les en-têtes à append sur titleForHeaderInSection de UITableView

Ce que je veux est fait manuellement dans le code ci-dessous pour la date 2009-12-11

NSDate *today = [NSDate dateWithSsortingng:@"2009-12-11 00:00:00 +0000"]; NSDate *yesterday = [NSDate dateWithSsortingng:@"2009-12-10 00:00:00 +0000"]; NSDate *thisWeek = [NSDate dateWithSsortingng:@"2009-12-06 00:00:00 +0000"]; NSDate *lastWeek = [NSDate dateWithSsortingng:@"2009-11-30 00:00:00 +0000"]; NSDate *thisMonth = [NSDate dateWithSsortingng:@"2009-12-01 00:00:00 +0000"]; NSDate *lastMonth = [NSDate dateWithSsortingng:@"2009-11-01 00:00:00 +0000"]; 

Adapté du Guide de programmation de date et heure :

 // Right now, you can remove the seconds into the day if you want NSDate *today = [NSDate date]; // All intervals taken from Google NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0]; NSDate *thisWeek = [today dateByAddingTimeInterval: -604800.0]; NSDate *lastWeek = [today dateByAddingTimeInterval: -1209600.0]; // To get the correct number of seconds in each month use NSCalendar NSDate *thisMonth = [today dateByAddingTimeInterval: -2629743.83]; NSDate *lastMonth = [today dateByAddingTimeInterval: -5259487.66]; 

Si vous voulez le nombre exact de jours exact en fonction du mois, vous devez utiliser un NSCalendar .

Peut-être un meilleur moyen d’écrire ceci, mais voici ce que j’ai trouvé sur la suggestion NSCalendar de Ben et y travailler à partir de NSDateComponents

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *components = [cal components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond ) fromDate:[[NSDate alloc] init]]; [components setHour:-[components hour]]; [components setMinute:-[components minute]]; [components setSecond:-[components second]]; NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0]; //This variable should now be pointing at a date object that is the start of today (midnight); [components setHour:-24]; [components setMinute:0]; [components setSecond:0]; NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0]; components = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[[NSDate alloc] init]]; [components setDay:([components day] - ([components weekday] - 1))]; NSDate *thisWeek = [cal dateFromComponents:components]; [components setDay:([components day] - 7)]; NSDate *lastWeek = [cal dateFromComponents:components]; [components setDay:([components day] - ([components day] -1))]; NSDate *thisMonth = [cal dateFromComponents:components]; [components setMonth:([components month] - 1)]; NSDate *lastMonth = [cal dateFromComponents:components]; NSLog(@"today=%@",today); NSLog(@"yesterday=%@",yesterday); NSLog(@"thisWeek=%@",thisWeek); NSLog(@"lastWeek=%@",lastWeek); NSLog(@"thisMonth=%@",thisMonth); NSLog(@"lastMonth=%@",lastMonth); 

NSDateComponents est agréable à obtenir aujourd’hui:

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *date = [NSDate date]; NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; NSDate *today = [cal dateFromComponents:comps]; 

Cela crée un NSDate avec seulement année, mois et date:

 (gdb) po today 2010-06-22 00:00:00 +0200 

Pour obtenir hier, etc., vous pouvez le calculer en utilisant NSDateComponents:

 NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:-1]; NSDate *yesterday = [cal dateByAddingComponents:components toDate:today options:0]; 
 + (NSDate*)dateFor:(enum DateType)dateType { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]]; if(dateType == DateYesterday) { comps.day--; } else if(dateType == DateThisWeek) { comps.weekday = 1; } else if(dateType == DateLastWeek) { comps.weekday = 1; comps.week--; } else if(dateType == DateThisMonth) { comps.day = 1; } else if(dateType == DateLastMonth) { comps.day = 1; comps.month--; } else if(dateType != DateToday) return nil; return [calendar dateFromComponents:comps]; } 

Swift 2

 let today = NSDate() let yesterday = today.dateByAddingTimeInterval(-86400.0) let thisWeek = today.dateByAddingTimeInterval(-604800.0) let lastWeek = today.dateByAddingTimeInterval(-1209600.0) let thisMonth = today.dateByAddingTimeInterval(-2629743.83) let lastMonth = today.dateByAddingTimeInterval(-5259487.66) // components of the date let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian) let components = calendar.components([.Year, .Month, .Day], fromDate: today) let (year, month, day) = (components.year, components.month, components.day) 

Swift 3

 let today = Date() let yesterday = today.addingTimeInterval(-86400.0) let thisWeek = today.addingTimeInterval(-604800.0) let lastWeek = today.addingTimeInterval(-1209600.0) let thisMonth = today.addingTimeInterval(-2629743.83) let lastMonth = today.addingTimeInterval(-5259487.66) // components of the date var calendar = Calendar(identifier: Calendar.Identifier.gregorian) let components = calendar.dateComponents([.year, .month, .day], from: today) let (year, month, day) = (components.year, components.month, components.day) 

Dans Swift 3 , veuillez noter que les composants de date sont facultatifs.

Les autres réponses n’ont tout simplement pas fonctionné pour moi (peut-être à cause de mon fuseau horaire). Voici comment je le fais:

 - (BOOL)isOnThisWeek:(NSDate *)dateToCompare { NSCalendar * calendar = [NSCalendar currentCalendar]; NSDate * today = [NSDate date]; int todaysWeek = [[calendar components: NSWeekCalendarUnit fromDate:today] week]; int dateToCompareWeek = [[calendar components: NSWeekCalendarUnit fromDate:dateToCompare] week]; int todaysYear = [[calendar components:NSYearCalendarUnit fromDate:today] year]; int dateToCompareYear = [[calendar components:NSYearCalendarUnit fromDate:dateToCompare] year]; if (todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear) { return YES; } return NO; } 

Si vous utilisez iOS 10+ ou MacOS 10.12+, vous pouvez utiliser ces deux méthodes de Calendar pour ce faire correctement.

  • func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date? ( docs )
  • func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval? ( docs )

Voici un exemple d’utilisation de ces méthodes dans Swift 3, avec les sorties des terrains de jeux dans mon fuseau horaire.

 let calendar = Calendar.current let now = Date() // => "Apr 28, 2017, 3:33 PM" let yesterday = calendar.date(byAdding: .day, value: -1, to: now) // => "Apr 29, 2017, 3:33 PM" let yesterdayStartOfDay = calendar.startOfDay(for: yesterday!) // => ""Apr 29, 2017, 12:00 AM" let thisWeekInterval = calendar.dateInterval(of: .weekOfYear, for: now) // => 2017-04-23 04:00:00 +0000 to 2017-04-30 04:00:00 +0000 let thisMonthInterval = calendar.dateInterval(of: .month, for: now) // => 2017-04-01 04:00:00 +0000 to 2017-05-01 04:00:00 +0000 let aDateInLastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: now) let lastWeekInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastWeek!) // => 2017-04-16 04:00:00 +0000 to 2017-04-23 04:00:00 +0000 let aDateInLastMonth = calendar.date(byAdding: .month, value: -1, to: now) let lastMonthInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastMonth!) // => 2017-03-26 04:00:00 +0000 to 2017-04-02 04:00:00 +0000 

Bonus: Vous pouvez utiliser le DateInterval s pour tester si une date tombe dans cette plage. En continuant d’en haut:

 thisWeekInterval!.contains(now) // => true lastMonthInterval!.contains(now) // => false 
 NSDate *today = [NSDate date]; // Today's date NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *weekdayComponents =[gregorian componentsNSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; NSInteger day = [weekdayComponents day]; 

J’aime vraiment l’object THCalendarInfo contenu dans ce projet:

http://github.com/jaredholdcroft/kcalendar

Je ne trouve pas tout à fait l’original. En utilisant cet object, vous pouvez passer à un jour précédent, au début d’une semaine, au début d’un mois, au jour d’une semaine, au jour d’un mois, etc., etc.

 NSDate *today = [[NSDate alloc] initWithTimeIntervalSinceNow:0]; 

Ceci est pour vérifier la date est ce mois ou pas

 func isOnThisMonth(dateToCompare: NSDate) -> Bool { let calendar: NSCalendar = NSCalendar.currentCalendar() let today: NSDate = NSDate() let todaysWeek: Int = calendar.components(NSCalendarUnit.Month, fromDate: today).month let dateToCompareWeek: Int = calendar.components(.Month, fromDate: dateToCompare).month let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear { return true } return false } 

Et le second ne change que le type de calendrierUnit pour faible comme ça

 func isOnThisWeek(dateToCompare: NSDate) -> Bool { let calendar: NSCalendar = NSCalendar.currentCalendar() let today: NSDate = NSDate() let todaysWeek: Int = calendar.components(NSCalendarUnit.Weekday, fromDate: today).weekday let dateToCompareWeek: Int = calendar.components(.Weekday, fromDate: dateToCompare).weekday let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear { return true } return false } 

J’espère que cela est utile à quelqu’un Merci.

J’ai déjà répondu à une question similaire et voici pourquoi ma réponse est meilleure:

  • Swift 3 !
  • Utilise “Yesterday” et “Today” de DateFormatter. Ceci est déjà traduit par Apple, ce qui vous évite de travailler!
  • Utilise la chaîne “1 semaine” déjà traduite de DateComponentsFormatter. (Encore moins de travail pour vous, avec la permission de Apple). Tout ce que vous avez à faire est de traduire la chaîne “% @ ago”. 🙂
  • Les autres réponses calculent incorrectement le moment où le jour passe de “aujourd’hui” à “hier” à etc. Les constantes fixes sont un grand nombre de raisons, car non. En outre, les autres réponses utilisent la date / heure actuelle à laquelle elles doivent utiliser la fin de la date / heure du jour actuel .
  • Utilise autoupdatingCurrent pour Calendar & Locale, ce qui garantit que votre application est immédiatement à jour avec les préférences de calendrier et de langue de l’utilisateur dans Settings.app