2010-07-14 7 views
7

J'essaie d'utiliser [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date] à deux dates différentes pour voir si elles tombent le même jour. Cependant, si mon fuseau horaire est différent (disons, quelque part en Allemagne), même si les dates sont évidemment les mêmes, les jours retournés sont différents. Si j'utilise NSYearCalendarUnit au lieu de NSEraCalendarUnit aux mêmes dates, les valeurs renvoyées sont les mêmes.NSCalendar obtenir la différence de jour faux

Le seul problème avec l'utilisation NSYearCalendarUnit est qu'il renvoie la même valeur pour le même jour d'années différentes, et il n'est pas simple de déterminer le nombre de jours entre deux dates si elles tombent sur des années différentes.

Des idées sur ce qui ne va pas ou comment déterminer plus facilement si deux dates sont le même jour, ou pour déterminer le nombre de jours entre elles?

Exemple:

[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Berlin"]]; 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDate *date1 = [NSDate dateWithTimeIntervalSinceReferenceDate:300751200]; 
NSDate *date2 = [NSDate dateWithTimeIntervalSinceReferenceDate:300836062.388569]; 

NSLog(@"\nDate 1: %@\nDate 2: %@",date1,date2); 
/*Output: 
Date 1: 2010-07-14 00:00:00 +0200 
Date 2: 2010-07-14 23:34:22 +0200 
*/ 

int day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date1]; 
int day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date2]; 

NSLog(@"\nDay 1: %i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 733966 
    Day 2: 733967 
*/ 

day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date1]; 
day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date2]; 

NSLog(@"\nDay 1:%i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 195 
    Day 2: 195 
*/ 
+0

J'ai le même problème. Il semble que l'ère commence à temps fixe, disons 00:00:01 1. Janvier de l'année 1 GMT. NSYearCalendarUnit semble commencer le 1er janvier 00:00:01 mais dans le fuseau horaire NSCalendar, qui peut ne pas être GMT. Cela pourrait expliquer, pourquoi les résultats de l'ère/année diffèrent. Je vais remplir un rapport de bug. Cela rend inutile la méthode de l'ordinalité pour la différence de jour si les jours ne sont pas dans la même année. –

Répondre

2

Voir http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html: « Discussion

Le ordinal est dans la plupart des cas pas la même que la valeur décomposée de l'unité. Généralement, les valeurs de retour sont 1 et supérieures. Par exemple, l'heure 00:45 est dans la première heure du jour, et pour les unités Heure et Jour respectivement, le résultat serait 1. Une exception est le calcul de la semaine dans le mois, qui retourne 0 pour les jours avant le premier En d'autres termes: 23:34:22 appartient à la dernière heure du jour, à 0. Le temps qui passe au-dessus du zéro est équivalent à: le jour suivant.

Peut-être que cela pourrait être traité comme un bug: heures dans une journée allant du premier au vingt-troisième à la zeroth? Je suggère: remplir un rapport de bug.

+0

Je ne suis pas sûr de comprendre ... Les deux dates sont évidemment le même jour, mais n'apparaissent pas comme le même jour dans l'ère, mais apparaissent le même jour dans l'année. Je suppose qu'un rapport de bogue est en ordre, mais y a-t-il une solution de contournement entre temps? –

+1

Cela dépend quand l'ère commence n'est-ce pas. Si l'ère commence à minuit * GMT * une année, alors vos deux dates ne sont pas le même jour (en époque). – JeremyP

6

Classé à un bug, mais j'ai ensuite vérifié Date and Time Programming Guide à nouveau. Si vous utilisez le code de la liste 13 (semblable au vôtre), il se comporte mal. Mais si vous utilisez la liste 14, cela fonctionne comme prévu.

EDIT: Conceptuellement, Apple a raison. Jésus-Christ (comme tout le monde) est né en temps absolu, indépendant des fuseaux horaires. Ainsi, la nouvelle ère a commencé au même moment, indépendamment des fuseaux horaires. La nouvelle année est à un moment différent dans chaque fuseau horaire. Cela pourrait expliquer les différences entre NSYearCalendarUnit et NSEraCalendarUnit. Le problème est qu'ils n'ont pas explicitement indiqué cela dans les docs.

Questions connexes