1

私はNSDate(それを と呼びましょうx)を持っています12 September, 2012 10:18PM (GMT)x現在のタイム ゾーン (EST) の真夜中の 1 分前に変換したいと考えています。したがって、変換後のESTで表される x は になります。これを行う最善の方法は何ですか?ありがとうNSDateFormatter12 September, 2012 11:59PM (EST)

4

2 に答える 2

2

このような操作は、日付の数値表現を使用して簡単に実行できます。この表現では、基準日からの秒数を扱います。

目的の基準日は、2001 年1timeIntervalSinceReferenceDate月 1 日00:00:00 GMT です。

NSDate* date = [NSDate date];
NSInteger secondsSinceReferenceDate = [date timeIntervalSinceReferenceDate];
secondsSinceReferenceDate += 86400 - (secondsSinceReferenceDate % 86400);
secondsSinceReferenceDate -= 60;
secondsSinceReferenceDate -= [NSTimeZone.localTimeZone secondsFromGMTForDate:date];
NSDate* justBeforeToday =
    [NSDate dateWithTimeIntervalSinceReferenceDate:secondsSinceReferenceDate];

NSLog(@"Date used was %@", date);
NSLog(@"Just before tomorrow is %@", justBeforeToday);

1 日は 86400 秒 (24 時間 × 60 分 60 × 60 秒 = 86400 秒) で86400 - (secondsSinceReferenceDate % 86400)あるため、これが午前 0 時までの残りの秒数であることがわかります。したがって、今日の日付 (またはその他の有効な日付) を取得し、この秒数を加算してからさらに 60 秒を減算すると、GMT タイムゾーンで今日の午後 11 時 59 分になります。

を使用[NSTimeZone.localTimeZone secondsFromGMTForDate:]すると、タイムゾーンが GMT タイムゾーンから何秒ずれているかがわかります。このオフセットを整数表現から差し引くと、ローカル タイムゾーンで午後 11 時 59 分になる時刻を効果的に取得できます。

出力例を次に示します。

Date used was 2012-09-12 22:37:49 +0000
Just before tomorrow is 2012-09-13 03:59:00 +0000

私も EDT タイムゾーンにいますが、これは正しい答えのようです (標準時は GMT から -5 であることを思い出してください。ただし、現在は夏時間であるため、GMT から -4 であり、不変です)。

于 2012-09-12T22:29:15.460 に答える
2

NSDateComponents をご覧ください: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/Reference/Reference.html

NSDate を NSDateComponents に変換し、時刻を 11:59PM に設定してから、NSDate に戻す必要があると思います。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date];
[components setHour:23];
[components setMinute:59];
NSDate *convertedDate = [calendar dateFromComponents:components];

NSLog(@"date=%@, convertedDate=%@", date, convertedDate);
于 2012-09-12T22:38:11.980 に答える