我正在尝试通过这种方式创建一个 NSDate 对象
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// [gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSMinuteCalendarUnit)fromDate:[NSDate date]];
NSInteger day = [weekdayComponents day];
NSInteger month = [weekdayComponents month];
NSInteger year = [weekdayComponents year];
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
[timeZoneComps setDay:day];
[timeZoneComps setMonth:month];
[timeZoneComps setYear:year];
[timeZoneComps setHour:00];
[timeZoneComps setMinute:00];
[timeZoneComps setSecond:01];
m_currentDate = [gregorian dateFromComponents:timeZoneComps];
当我记录 currentDate 时,我得到了这个
"2014-07-07 06:00:01 +0000"
如果我将它保存到 plist 中,我会得到它
07-Jul-2014 11:30:01 am
如果我使用“UTC”作为时区
我明白了
"2014-07-07 00:00:01 +0000"
在 plist 中它显示为
07-Jul-2014 5:30:01 am
我不明白这是怎么回事,谁能帮我解决这个问题
我想知道,如果我不设置任何时区,将使用什么时区?
我们是否需要将 UTC 显式设置为时区,还是需要使用 systemTimeZone。
最佳答案
关于NSDate
,您需要认识到的是,不存在诸如日、周、月、年、时区等之类的东西...
NSDate
纯粹是一个时间点。它没有关于它是什么时区等的信息...
实际上它只是一个数字。如果有帮助的话,您可以将其视为使用 UTC。
为您提供时区等信息的类有 NSCalendar
、NSDateFormatter
等...
我猜您所在的时区是 UTC+6?这就是为什么当您使用 00:00:01 创建日期并将其注销时,它会显示为 06:00:01。
这与NSDate
无关。您在控制台中看到的是一个字符串。它是使用默认时区(您自己的)的日期对象的表示形式。
我必须看看你保存到 plist 的代码,但我怀疑这是同样的问题。您正在保存某些内容并假设它使用特定时区,但实际上并非如此。
关于ios - 与 NSDate 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608953/