对NSDateComponents的困惑

时间:2015-04-03 16:04:12

标签: ios objective-c nsdatecomponents

我有这个方法,如果新的一天开始,它会删除字典中的所有对象:

-(void)flushDictionaryIfNeeded{

    NSLog(@"Flush called");
    if([self.messagedTodayDict count]>0) {

        //get any date
        NSDate *aDate = nil;
        NSArray *values = [self.messagedTodayDict allValues];
        aDate = [values objectAtIndex:0];

        NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:aDate];
        NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
        NSLog(@"Today is %@",[NSDate date]);
        NSLog(@"Date in the dicitonary is %@",aDate);

        if([today day] == [otherDay day] &&
           [today month] == [otherDay month] &&
           [today year] == [otherDay year] &&
           [today era] == [otherDay era]) {

            NSLog(@"Don't flush");
        }

        else {

            NSLog(@"It's a new day! erase dictionary!");
            [self.messagedTodayDict removeAllObjects];

        }

    }

}

我住在台湾,NSLog我打印的任何日期都比这时间落后8小时。我在午夜前五分钟打电话给这个方法(台湾时间)我明白了:

Today is 2015-04-03 15:55:09 +0000
Date in the dicitonary is 2015-04-03 15:09:09 +0000

这是有道理的,日期存储为8小时后,字典不会刷新/删除所有对象。

现在我在午夜调用该方法:

Today is 2015-04-03 16:00:22 +0000
Date in the dicitonary is 2015-04-03 15:09:09 +0000

并且字典删除所有对象。如果我在比较下面的日期组件,为什么会这样做呢?月份和日期与今天和字典中的日期相同。不要真的了解这里发生的事情。一些指示将非常感激。

1 个答案:

答案 0 :(得分:2)

当您直接NSLog日期对象时,您将获得与上面相同的UTC日期。但日期组件将根据您当地的时区(除非您修改时区)。 [NSCalendar currentCalendar]会根据您当前的区域设置为您提供日历,包括时区(see here)。

如果要正确记录日期,请使用NSDateFormatter:

NSDateFormatter* formatter = [NSDateFormatter new];
formatter.dateStyle = NSDateFormatterLongStyle;
formatter.timeStyle = NSDateFormatterLongStyle;
NSLog(@"%@",[fomatter stringFromDate: yourDate]);

可以使用您想要的任何时间/日期样式(短,中,长,完整),也可以使用date formatting syntax

设置自定义格式