Pergunta

Estou usando o código abaixo para disparar localNotification exatamente às 17h IST.Mas ao registrar o fireDate, ele não está exibindo a hora que eu queria.Se eu errei em algum lugar?

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];

Minha saída: Data do incêndio : 2014-07-29 16:48:20 +0000

Foi útil?

Solução

O motivo pelo qual você não está recebendo 17h é que não há nada no código que tente definir o horário para 17h.Em vez disso você tem isto:

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

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

O que isso significa é um tempo de 11 horas e 30 minutos no futuro.Você não receberá 17h, a menos que execute o código exatamente às 5h30.Mas o código não menciona IST em qualquer lugar, então você não chegará às 17h nessa zona.

Também é confuso o que você está fazendo no final do trecho de código - convertendo fireDate para uma string, mas depois convertendo essa string de volta para uma data.Isto não serve para nada.

Para chegar às 17h em um fuso horário específico, você precisa fazer algo como o seguinte.Isso marca as próximas 17h no fuso horário solicitado, que pode ser amanhã se já for depois das 17h:

    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];

Se quiser imprimir isso em um formato legível, você pode fazer algo como o seguinte.Mas NSDateFormatter é necessário apenas para apresentar a data ao usuário - não faz parte da obtenção do resultado desejado NSDate.

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:zone];
    [formatter setDateStyle:NSDateFormatterLongStyle];
    [formatter setTimeStyle:NSDateFormatterLongStyle];
    NSString *targetDateString = [formatter stringFromDate:targetDate];
    NSLog(@"Target date: %@", targetDateString);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top