1

我有一个NSDate(让我们称之为x12 September, 2012 10:18PM (GMT),。我想转换x为当前时区 (EST) 午夜前的一分钟。因此,转换后EST用x 表示的 xNSDateFormatter将是12 September, 2012 11:59PM (EST)。最好的方法是什么?谢谢

4

2 回答 2

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

我也在 E​​DT 时区,这看起来是正确的答案(记住标准时间是格林威治标准时间 -5,但现在我们处于夏令时,所以它是格林威治标准时间 -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: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);
于 2012-09-12T22:38:11.980 回答