0

destinationDate 和组件的结果不同。我该如何解决这个问题?

NSTimeZone* sourceTimeZone      = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSDate* sourceDate              = [NSDate date];
NSInteger sourceGMTOffset       = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset  = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval         = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate         = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

NSCalendar *calendar            = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components    = [calendar components:(NSYearCalendarUnit  |
                                                        NSMonthCalendarUnit |
                                                        NSDayCalendarUnit   |
                                                        NSHourCalendarUnit  |
                                                        NSMinuteCalendarUnit|
                                                        NSSecondCalendarUnit) fromDate:destinationDate];

NSLog(@"%@", destinationDate); 
NSLog(@"%@", components);

2013-04-24 19:27:09 +0000

历年:2013 月:4 闰月:无 日:25 时:4 分:27 秒:9

4

2 回答 2

5

日期 ( destinationDate) 以 GMT 打印。但是,日期组件不是因为日历是使用本地时区创建的。

如果你尝试它,calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]你会从两者中得到相同的结果。否则,您将获得两次添加的差异(第一次由您的代码,第二次由日历)

实际上,您的代码没有多大意义。NSDate永远不应该被时区修改,因为它不包含任何时区信息。ANSDate总是代表一个特定的时刻,独立于时区。仅当您要将日期转换为字符串时才转换日期 - 当您这样做时,请使用NSCalendarNSDateFormatter设置正确的时区。

以下代码足以打印出系统(默认)时区的日期,

NSDate* sourceDate              = [NSDate date];
NSCalendar *calendar            = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [calendar components:(NSYearCalendarUnit  |
                                                     NSMonthCalendarUnit |
                                                     NSDayCalendarUnit   |
                                                     NSHourCalendarUnit  |
                                                     NSMinuteCalendarUnit|
                                                     NSSecondCalendarUnit) fromDate:destinationDate];

NSLog(@"%@", sourceDate); 
NSLog(@"%@", components);
于 2013-04-24T12:03:13.560 回答
1

NSDateComponents总是以格林威治标准时间的形式给出日期,所以只需像下面这样简单地放置你就会得到当前日期。

NSDateComponents *components    = [calendar components:(NSYearCalendarUnit  |
                                                            NSMonthCalendarUnit |
                                                            NSDayCalendarUnit   |
                                                            NSHourCalendarUnit  |
                                                            NSMinuteCalendarUnit|
                                                            NSSecondCalendarUnit) fromDate:[NSDate date]];

替换destinationDate[NSDate date].

输出:

 2013-04-24 16:05:08 +0000

<NSDateComponents: 0x7e3e5b0>
    Calendar Year: 2013
    Month: 4
    Day: 24
    Hour: 16
    Minute: 5
    Second: 8
于 2013-04-24T10:36:51.780 回答