NSDate休息5个小时

Tro*_*ton 3 objective-c xcode4

我运行以下代码:

NSDate*now = [NSDate date];

NSLog(@"now: %@", now);
Run Code Online (Sandbox Code Playgroud)

得到:

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问题?

Sni*_*ips 9

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

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

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

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

[dateFormatter setLocale:[NSLocale currentLocale]];
Run Code Online (Sandbox Code Playgroud)

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

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

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

[dateFormatter setLocale:usLoc];
Run Code Online (Sandbox Code Playgroud)

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

可以在这里找到更具体的时区帮助......

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

但是,如果您想显示到期时间,您是否仍然希望它在用户的currentLocale中?


Abi*_*ern 5

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

2011-09-16 16:14:16.434 iSavemore[1229:7907] now: 2011-09-16 21:14:16 +0000
                                                                      ^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

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

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