Запустите localNotification ровно в 17:00 по индийскому стандартному времени.
-
21-12-2019 - |
Вопрос
Я использую приведенный ниже фрагмент кода для запуска localNotification ровно в 17:00 по восточному стандартному времени.Но при регистрации fireDate не отображается время, которое я хотел.Ошибся ли я где-нибудь?
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];
Мой результат: Дата пожара : 2014-07-29 16:48:20 +0000
Решение
Причина, по которой вы не получаете 17:00, заключается в том, что в коде нет ничего, что пытается установить время на 17:00.Вместо этого у вас есть это:
[dateComponents setHour:11];
[dateComponents setMinute:30];
fireDate = [calendar dateByAddingComponents:dateComponents
toDate:currentDate
options:0];
Это дает вам возможность перенестись в будущее на 11 часов 30 минут.Вы не получите 17:00, если не запустите код ровно в 5:30 утра.Но в кодексе не упоминается IST
где угодно, так что в этой зоне вы не получите 17:00.
Также сбивает с толку то, что вы делаете в конце фрагмента кода: конвертируете fireDate
в строку, но затем преобразуя эту строку обратно в дату.Это бесполезно.
Чтобы получить 5 вечера в определенном часовом поясе, вам нужно сделать что-то вроде следующего.Получается следующее 17:00 в запрошенном часовом поясе, которое может быть завтра, если там уже после 17:00:
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];
Если вы хотите распечатать это в удобочитаемой форме, вы можете сделать что-то вроде следующего.Но NSDateFormatter
необходим только для представления даты пользователю. Это не является частью получения желаемого NSDate
.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:zone];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterLongStyle];
NSString *targetDateString = [formatter stringFromDate:targetDate];
NSLog(@"Target date: %@", targetDateString);