Question

Je suis ci-dessous à l'aide de morceau de code à feu localNotification exactement à 5 h IST.Mais quand le journal le fireDate, il n'est pas l'affichage de l'heure que je voulais.Si j'ai mal tourné n'importe où?

UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    //localNotification.fireDate = myNewDate;

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    NSDate *currentDate = [NSDate date];
    NSDate *fireDate = nil;

    //[dateComponents setDay:3];  // ...or whatever day.
    [dateComponents setHour:11];
    [dateComponents setMinute:30];

    fireDate = [calendar dateByAddingComponents:dateComponents
                                          toDate:currentDate
                                         options:0];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    //Optionally for time zone converstions
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    NSString *stringFromDate = [formatter stringFromDate:fireDate];


    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *dateFromString = [[NSDate alloc] init];
    dateFromString = [dateFormatter dateFromString:stringFromDate];

    NSLog(@"Fire date : %@",dateFromString);
    [localNotification setFireDate:dateFromString];

Mon résultat: Le feu de la date : 2014-07-29 16:48:20 +0000

Était-ce utile?

La solution

La raison pour laquelle vous n'obtenez pas 5PM est qu'il n'y a rien dans le code qui tente de définir le temps à 5PM.Au lieu de cela, vous avez ceci:

[dateComponents setHour:11];
[dateComponents setMinute:30];

fireDate = [calendar dateByAddingComponents:dateComponents
                                      toDate:currentDate
                                     options:0];

Ce qui vous permet de vous est un temps de 11 heures et 30 minutes dans le futur.Vous n'obtiendrez pas de 5PM à moins que vous arrive d'exécuter le code à 5:30 du matin.Mais le code ne mentionne pas IST n'importe où, alors vous n'obtiendrez pas 5PM dans cette zone.

C'est aussi la confusion entre ce que vous faites à la fin de l'extrait de code-- conversion fireDate pour une chaîne, mais puis de les convertir en chaîne droite de retour pour une date.Cela ne sert à rien.

Pour obtenir 5PM dans un fuseau horaire particulier que vous devez faire quelque chose comme ce qui suit.Cela devient à la prochaine 5PM à la demande de la zone, qui peut-être demain si il est déjà au bout de 5 H il y a:

    NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    [calendar setTimeZone:zone];

    NSInteger targetHour = 17; // 5pm

    NSDate *now = [NSDate date];
    NSInteger componentFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit;
    NSDateComponents *nowDateComponents = [calendar components:componentFlags fromDate:now];

    if (nowDateComponents.hour >= targetHour) {
        nowDateComponents.day += 1;
    }
    nowDateComponents.hour = targetHour;

    NSDate *targetDate = [calendar dateFromComponents:nowDateComponents];

Si vous souhaitez imprimer ce dans une forme lisible par l'homme, vous pouvez faire quelque chose comme ce qui suit.Mais NSDateFormatter n'est nécessaire que pour la présentation de la date à l'utilisateur-- il ne fait pas partie de l'obtention de la désirée NSDate.

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:zone];
    [formatter setDateStyle:NSDateFormatterLongStyle];
    [formatter setTimeStyle:NSDateFormatterLongStyle];
    NSString *targetDateString = [formatter stringFromDate:targetDate];
    NSLog(@"Target date: %@", targetDateString);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top