2013-04-24 87 views
0

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

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年4月24日19时27分09秒+0000

日历年份:2013 月:4 闰月:没有 日:25 小时:4 分:27 第二:9

+0

你是什么问题就在这里,日期的说明会始终处于GMT。它看起来像是你的localTimeZone比GMT落后5个小时。第一个日志可以解释为4:27 PM,它与组件 – Anupdas 2013-04-24 10:38:24

+0

中显示的相同,你是否已经得到了答案。 – Balu 2013-04-24 11:19:52

回答

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 
+0

你是如何得出OP想要的? – Anupdas 2013-04-24 10:48:19

+0

他规定destinationDate和组件不同,这就是为什么我找到他的代码中的问题。 – Balu 2013-04-24 10:49:42

+0

在他的代码中,他正在创建一个sourceDate作为currentDate,并使用间隔来创建一个destinationDate,这取决于timeZone将被提前或延迟。这个问题本身非常模糊,你为什么说要用currentDate替换destinationDate。很混乱。 – Anupdas 2013-04-24 10:53:48

3

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

如果您使用calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]进行测试,您将获得两者的相同结果。否则,你会得到差异两次(第一次由你的代码,第二次由日历)

其实,你的代码没有多大意义。不应该由时区修改NSDate,因为它不包含任何时区信息。 A NSDate始终代表GMT格式的日期。仅在要将其转换为字符串时才转换日期 - 如果要这样做,请在使用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);