النار localNotification بالضبط في الساعة 5 مساء IST
-
21-12-2019 - |
سؤال
أنا باستخدام أدناه قطعة من التعليمات البرمجية إلى النار localNotification بالضبط في الساعة 5 مساء 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
المحلول
السبب في أنك لا تحصل على 5 مساء أنه لا يوجد شيء في القانون أن محاولات تعيين الوقت إلى الساعة 5 مساء.بدلا من ذلك لديك هذا:
[dateComponents setHour:11];
[dateComponents setMinute:30];
fireDate = [calendar dateByAddingComponents:dateComponents
toDate:currentDate
options:0];
ما الذي يحصل لك هو الوقت 11 ساعة و 30 دقيقة في المستقبل.أنك لن تحصل على 5 مساء إلا إذا كنت يحدث لتشغيل التعليمات البرمجية في تمام الساعة 5:30 صباحا.لكن الرمز لا يذكر IST
في أي مكان, حتى أنك لن تحصل على 5 مساء في تلك المنطقة.
انها مربكة أيضا ما تفعله في نهاية مقتطف الشفرة-- تحويل fireDate
إلى سلسلة ، ولكن بعد ذلك تحويل هذه السلسلة الحق في العودة إلى التاريخ.هذا لا يخدم أي غرض.
على الساعة 5 مساء في منطقة زمنية معينة تحتاج إلى القيام بشيء مثل التالية.هذا يحصل القادم الساعة 5 مساء في طلب المنطقة الزمنية, التي قد تكون غدا إذا كان بالفعل بعد الساعة 5 مساء هناك:
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);