質問

下記のコードを使用して、五つ目の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);
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top