我有一个NSDate
(让我们称之为x
)12 September, 2012 10:18PM (GMT)
,。我想转换x
为当前时区 (EST) 午夜前的一分钟。因此,转换后EST
用x 表示的 xNSDateFormatter
将是12 September, 2012 11:59PM (EST)
。最好的方法是什么?谢谢
2 回答
使用日期的数字表示可以轻松完成此类操作。在此表示中,您处理自参考日期以来的秒数。
此处的参考日期timeIntervalSinceReferenceDate
是 2001 年 1 月 1日,格林威治标准时间 00:00:00。
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);
由于一天有 86400 秒(24 小时乘以 60 分钟 60 乘以 60 秒 = 86400 秒),你知道那86400 - (secondsSinceReferenceDate % 86400)
是距离午夜还有多少秒。因此,如果您取今天的日期(或任何其他有效日期),加上这个秒数,然后再减去 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 时区,这看起来是正确的答案(记住标准时间是格林威治标准时间 -5,但现在我们处于夏令时,所以它是格林威治标准时间 -4,这是不变的)。
看看 NSDateComponents:https ://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/Reference/Reference.html
我相信您需要将 NSDate 转换为 NSDateComponents,将时间设置为晚上 11:59,然后再转换回 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);