Pregunta

Yo estoy usando el siguiente trozo de código a fuego localNotification exactamente a las 5 pm IST.Pero cuando el registro de la fireDate, no es mostrar el tiempo que yo quería.Si me ha ido mal en cualquier 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];

Mi resultado: El fuego de la fecha de : 2014-07-29 16:48:20 +0000

¿Fue útil?

Solución

La razón por la que usted no está consiguiendo las 5PM es que no hay nada en el código que intenta establecer el tiempo a 5PM.En lugar de tener esto:

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

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

Lo que consigue es un tiempo de 11 horas y 30 minutos en el futuro.Usted no obtendrá 5 de la tarde a menos que suceder para que se ejecute el código exactamente a las 5:30 de la mañana.Pero el código no menciona IST en cualquier lugar, así que usted no conseguirá 5PM en esa zona.

También es confuso lo que estamos haciendo en el final del fragmento de código-- la conversión de fireDate a una cadena, pero luego convertir esa cadena a la derecha de nuevo a una fecha.Esto no sirve de nada.

Para obtener las 5PM en un momento particular de la zona que usted necesita para hacer algo como lo siguiente.Esto hace que el próximo 5 de la tarde en la solicitada zona de tiempo, que puede ser mañana si es que ya después de las 5PM hay:

    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 desea imprimir en un formato legible, se puede hacer algo como lo siguiente.Pero NSDateFormatter sólo es necesario para la presentación de la fecha a la que el usuario no es parte de conseguir la deseada 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top