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