与NSDate混淆

时间:2014-07-07 10:55:35

标签: ios nsdate nstimezone

我正在尝试以这种方式创建一个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显式设置为timeZone,或者我们需要使用systemTimeZone。

1 个答案:

答案 0 :(得分:1)

你需要认识到的NSDate是没有日,周,月,年,时区等......

NSDate纯粹是一个时间点。它没有关于它是什么时区等的信息......

实际上它只是一个数字。如果有帮助,您可以将其视为使用UTC。

为您提供时区等级的课程为NSCalendarNSDateFormatter等等。

我猜你在UTC + 6的时区?这就是为什么当您使用00:00:01创建日期并将其注销然后显示为06:00:01。

这与NSDate无关。您在控制台中看到的是一个字符串。它是使用默认时区(您自己的)的日期对象的表示。

我必须看到你保存到plist的代码,但我怀疑这是同样的问题。你正在保存某些东西,并假设它正在使用特定的时区,而实际上并非如此。