午後5時に正確に火災地域を発射する
-
21-12-2019 - |
質問
下記のコードを使用して、五つ目のISTでローカルノート化を発射しています。しかし、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
解決
あなたが5pmになっていない理由は、時刻を5pmに設定しようとするコードに何もないということです。代わりにあなたはこれを持っています:
[dateComponents setHour:11];
[dateComponents setMinute:30];
fireDate = [calendar dateByAddingComponents:dateComponents
toDate:currentDate
options:0];
.
あなたが将来11時間30分であることです。あなたが正確に午前5時30分にコードを実行することがない限り、あなたは5pmになることはありません。しかし、コードはどこでもIST
については言及していませんので、そのゾーンで5pmが得られません。
コードスニペットの末尾で行っていることを混乱させる - fireDate
を文字列に変換しますが、その文字列をDATEに戻します。これは目的はありません。
特定のタイムゾーンで5pmを得るためには、次のようなことをする必要があります。これは要求されたタイムゾーンで次の5pmを取得します。これは明日それがすでに5pm後にある場合は明日になる可能性があります。
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
は、日付をユーザーに提示するためにのみ必要です。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:zone];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterLongStyle];
NSString *targetDateString = [formatter stringFromDate:targetDate];
NSLog(@"Target date: %@", targetDateString);
. 所属していません StackOverflow