Objective c 为什么不是';我的时区没有保存到我的NSDate中吗?

Objective c 为什么不是';我的时区没有保存到我的NSDate中吗?,objective-c,timezone,nsdate,nsdateformatter,Objective C,Timezone,Nsdate,Nsdateformatter,我必须从objective-c中的NSString初始化NSDate对象。我是这样做的: NSString *dateString = [[webSentence child:@"DateTime"].text stringByReplacingOccurrencesOfString:@"T" withString:@" "]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setD

我必须从objective-c中的NSString初始化NSDate对象。我是这样做的:

NSString *dateString = [[webSentence child:@"DateTime"].text stringByReplacingOccurrencesOfString:@"T" withString:@" "];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-mm-dd HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Budapest"]];

NSDate *date = [[NSDate alloc] init];
date = [dateFormatter dateFromString:dateString];
例如:当我尝试使用字符串值@“2011-01-02 17:49:54”时,我得到一个NSDate 2011-01-02 16:49:54+0000。正如您所看到的,这两个值之间有一个小时的差异。NSDate有一个错误的值,它应该与我在dateFormatter中设置的时区的字符串中定义的值完全相同。它似乎使用我定义的日期字符串作为UTC,即使我将其时区设置为“欧洲/布达佩斯”。我如何解决这个问题

谢谢

有两件事:

1) 日期格式字符串中有错误。您应该使用
MM
表示月份,而不是
MM
(小写MM表示分钟)


2) 创建NSDate对象后,需要使用NSDateFormatter方法
stringFromDate:
生成本地化到特定时区的日期字符串。如果对NSDate对象直接执行NSLog(),则默认情况下,它会将日期显示为GMT(GMT比布达佩斯时间晚一小时)

NSDate存储相对于标准参考日期的日期。从类文档中:

NSDate的唯一基本方法TimeIntervalsIncerenceDate为NSDate接口中的所有其他方法提供了基础。此方法返回相对于绝对参考日期(2001年1月1日格林尼治标准时间)的时间值

NSDate本身没有任何时区概念。因此,NSDateFormatter做了正确的事情:它转换了一个日期,您告诉它有GMT偏移量(通过指定时区),并为该日期提供了一个“标准化”NSDate

如果要查看欧洲/布达佩斯时区中表示的日期,请使用现有的日期格式化程序(-stringFromDate:)或适当的NSDate描述方法(例如,-descriptionWithCalendarFormat:timeZone:locale:)

另外,在编写的代码中根本不需要alloc/init。在非电弧中,这将是泄漏

p.p.S.-您的日期格式不正确,并且给出了无意义的结果。我已经对您的代码进行了如下清理(在ARC下测试):


这意味着如果我有一个时区,我就不能将日期存储到带有该时区的NSDate对象中?我必须将时区存储在其他位置,并在显示时使用它?因此NSdate没有时区概念。但它有GMT概念吗?我不能将时区转换为GMT小时并将其添加到NSDate对象中吗?
NSString *dateString = @"2011-09-02 17:49:54";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"Europe/Budapest"];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter setTimeZone:tz];

NSDate *date = [dateFormatter dateFromString:dateString];
NSLog(@"%@", [dateFormatter stringFromDate:date]);
NSLog(@"%@", [date descriptionWithCalendarFormat:nil timeZone:tz locale:nil]);