Deux dates sont-elles dans la même semaine ? Cette date est-elle hier ? avant-hier ? avant-avant-hi

colas_colas_ Membre
octobre 2015 modifié dans Objective-C, Swift, C, C++ #1

Pour ceux que ça intéresserait !



 



@implementation NSDate (CBDMiscMethods)




/**************************************/
#pragma mark - Aux
/**************************************/

+ (NSLocale *)frenchLocale_CBDMiscMethods
{
static NSLocale * _frenchLocale ;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_frenchLocale = [[NSLocale alloc] initWithLocaleIdentifier:@fr_FR];
});

return _frenchLocale;
}



+ (NSCalendar *)calendar_CBDMiscMethods
{
static NSCalendar * _calendar ;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_calendar = [NSCalendar currentCalendar];
_calendar.locale = [self frenchLocale_CBDMiscMethods];
});

return _calendar;
}




/**************************************/
#pragma mark - Core
/**************************************/

+ (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate_cbd_:(NSDate*)toDateTime
{
NSDate *fromDate;
NSDate *toDate;

NSCalendar *calendar = [[self class] calendar_CBDMiscMethods];

fromDate = [calendar startOfDayForDate:fromDate];
toDate = [calendar startOfDayForDate:toDate];

NSDateComponents *difference = [calendar components:NSCalendarUnitDay
fromDate:fromDate
toDate:toDate
options:0];
return [difference day];
}




/*
From SO
http://stackoverflow.com/a/14205168/1670830
*/
- (BOOL)isOnSameWeekAsDate_cbd_:(NSDate*)otherDate
{
NSCalendar *calendar = [[self class] calendar_CBDMiscMethods];
unsigned unitFlags = NSCalendarUnitYearForWeekOfYear | NSCalendarUnitWeekOfYear ;

NSDateComponents *components = [calendar components:unitFlags
fromDate:self];
NSDateComponents *otherComponents = [calendar components:unitFlags
fromDate:otherDate];

return ( [components yearForWeekOfYear] == [otherComponents yearForWeekOfYear] && [components weekOfYear] == [otherComponents weekOfYear] );
}






@end


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Et si la semaine commence dimanche ou lundi, ça marche encore ?
  • AliGatorAliGator Membre, Modérateur
    Pour la question "Deux dates sont-elles dans la même semaine ?" il y a déjà  une API pour ça :

    BOOL sameWeek = [calendar isDate:date1 equalToDate:date2 toUnitGranularity:NSCalendarUnitWeek];
  • colas_colas_ Membre
    octobre 2015 modifié #4

    Je ne sais pas Joanna. Je dirai que la semaine commence lundi.


  • Mais en fait ça va dépendre de la local du NSCalendar I guess ;-)


  • colas_colas_ Membre
    octobre 2015 modifié #6

    @Ali ;


     


    T'es sûr ? NSCalendarUnitWeek n'existe pas. Il y a NSCalendarUnitWeekOfYear.


     


    Mais même dans ce cas, je me demande si ça marchera. Si deux dates sont dans la 1ère semaine de l'année mais dans des années différentes, je pense que ta méthode répondra YES.


     


    Après vérification, ça marche


     


     


  • AliGatorAliGator Membre, Modérateur
    Bah dans ce cas tu rajoutes la unit Year en plus dans les options et basta...
  • ça marche aussi le 22 Avril 2011 ?

  • AliGatorAliGator Membre, Modérateur
    octobre 2015 modifié #9

    ça marche aussi le 22 Avril 2011 ?


    NSCalendar sait très bien gérer les cas aux limites, comme par exemple les cas où l'on voyage dans le temps, par exemple en passant de 23h59 à  24h00 avant de passer à  0h00 ou à  l'inverse de perdre des leap seconds, etc...
    D'ailleurs d'après la documentation de [NSCalendar startOfdayForDate:], ça marche même quand il y a "plusieurs minuits le même jour" par exemple.

    Du coup je pense qu'au même titre, s'il y a plusieurs 5h02pm, ça marche pareil et ça le gère correctement. Par contre ça ne le prend en compte que quand tu appelles ces méthodes sur le bon calendrier ([NSCalendar tardisCalendar]) bien sûr.
  • Y sont doués à  Cupertino quand même ..

Connectez-vous ou Inscrivez-vous pour répondre.