NSDate休息5个小时

时间:2011-09-16 21:22:28

标签: objective-c xcode4

我运行以下代码:

NSDate * now = [NSDate date];

NSLog(@"now: %@", now);

并获得:

2011-09-16 16:14:16.434 iSavemore [1229:7907]现在:2011-09-16 21:14:16 +0000

你可以看到我在16:14:16(下午4:14)运行这个,但NSDate正在返回21:16:16(晚上9:14!)。这是Xcode4问题还是NSDate问题?

4 个答案:

答案 0 :(得分:9)

NSDate默认为通用时区(也称为GMT)。

我猜你在东海岸的某个地方,比UTC晚了5个小时。

尝试将此添加到日期格式化程序中...

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];

[dateFormatter setLocale:[NSLocale currentLocale]];

......你应该看看当地时间。

如果要使用指定的区域设置而不是“currentLocale”,请为相关区域设置创建NSLocale。

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[dateFormatter setLocale:usLoc];

......实际上那是美国(很可能不是中环)。

此处可以找到更具体的时区帮助...

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

但是,如果你想显示到期时间,你还不想在用户的currentLocale中使用它吗?

答案 1 :(得分:5)

如果查看输出,您会看到日志包含时区:

2011-09-16 16:14:16.434 iSavemore[1229:7907] now: 2011-09-16 21:14:16 +0000
                                                                      ^^^^^^

日志的时间戳是当地时间。我假设你所在的时区比UTC早5个小时。

NSDate 是指某个特定时间点。您可以根据需要显示此项;通常使用NSDateFormatter。

这就是为什么你会看到许多反对存储时间或日期不是NSDate的建议。如果您尝试将其存储为字符串,那么稍后在尝试处理不同时区的显示时会遇到很多麻烦。

答案 2 :(得分:0)

尝试将NSDate的时区设置为符合您需要的时区,例如[NSTimeZone localTimeZone]

答案 3 :(得分:-1)

这里只是一个疯狂的猜测,但也许它与时区有关?