2016-01-19 2 views
2

J'essaie d'utiliser NSDateComponents afin de tester si une date dynamique se produit "aujourd'hui". Je l'utilise pour extraire l'année/mois/jour et ensuite comparer ces valeurs pour deux NSDates. En théorie, cela devrait fonctionner. Je suis sur la côte est, donc EST, -5 de l'UTC.NSDateComponents convertissant la date UTC en fuseau horaire local, déconnecter "aujourd'hui" comparaison nsdate

heure actuelle: 12:40:53, EST

Voici les NSDates correctes, en UTC. Les temps sont corrects UTC:

  • [date de NSDate] actuel: 2016-01-19 17:40:53 +0000
  • Activité NSDate: 19/01/2016 00:00:00 +0000

Voici mon journal, montrant chaque date. Il est en train de convertir les dates en fuseau horaire 2016-01-19 07:00:00. Comme la date actuelle est au milieu de la journée, le décalage de -5 heures ne la fait pas changer de jour. Le minuit passe cependant à un jour de retour. Comment puis-je l'obtenir pour respecter l'UTC?

NSLog:

2016-1-19 12:40:53 (America/New_York (EST) offset -18000), 
2016-1-18 19:0:0 (America/New_York (EST) offset -18000) 

code:

NSDateComponents *current = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:_date]; 
NSDateComponents *activity = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:activityModel.date]; 

// attempt to set timezones to UTC manually, doesn't change anything 
activity.calendar = [NSCalendar currentCalendar]; 
activity.calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 

current.calendar = [NSCalendar currentCalendar]; 
current.calendar.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 


NSLog(@"%ld-%ld-%ld %ld:%ld:%ld (%@), %ld-%ld-%ld %ld:%ld:%ld (%@)", (long)[current year],(long)[current month], (long)[current day], (long)[current hour], (long)[current minute], (long)[current second], [current timeZone].description, (long)[activity year], (long)[activity month], (long)[activity day],(long)[activity hour], (long)[activity minute], (long)[activity second],[current timeZone].description); 

if([current day] == [activity day] && 
      [current month] == [activity month] && 
      [current year] == [activity year] && 
      [current era] == [activity era]) { 

      // do something if activity on current day 
} 
+0

Vous pouvez simplement demander NSCalendar cette question. Probablement plus facile que le débogage du code de date. Voir '- [NSCalendar isDateInToday]'. – Avi

+0

Essayé ceci: if ([[NSCalendar currentCalendar] isDateInToday: activityModel.date]) { Il échoue toujours de la même manière que ma comparaison d'origine. Mais en effet, beaucoup plus simple. – Miro

Répondre

2

Vous changez le fuseau horaire de l'NSDateComponents. Mais vous voulez changer le fuseau horaire du calendrier avant d'appeler components (ou appelez le NSCalendar jour des routines de vérification), .: par exemple

NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; 
calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

if ([calendar isDate:_date inSameDayAsDate:activityModel.date]) { 
    NSLog(@"same"); 
} else { 
    NSLog(@"diff"); 
} 

Mais si l'heure locale était 2016-01-19 21:00:00 -0500 (à savoir le 20, UTC). Voulez-vous dire que c'était aussi le même jour que la date d'activité dans votre exemple? Si oui, alors vous êtes vraiment dire que vous voulez utiliser le calendrier local pour _date et UTC pour la activityModel.date, .: par exemple

NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; 

NSDateComponents *current = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:_date]; 

calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

NSDateComponents *activity = [calendar components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond |NSCalendarUnitTimeZone fromDate:activityModel.date]; 

if ([current day] == [activity day] && [current month] == [activity month] && [current year] == [activity year] && [current era] == [activity era]) { 
    NSLog(@"same"); 
} else { 
    NSLog(@"diff"); 
} 
+0

Merci. Je vais commencer par le premier et adapter plus de la seconde au besoin. C'est mieux que mon vieux bidouillage de simplement ajouter/soustraire 12 heures pour éviter le problème du passage à l'UTC de minuit. – Miro