我必须从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,即使我将其时区设置为"欧洲/布达佩斯"。如何解决此问题?
谢谢!
NSDate存储相对于标准参考日期的日期。来自类文档:
NSDate的唯一基元方法timeIntervalSinceReferenceDate为NSDate接口中的所有其他方法提供了基础。此方法返回相对于绝对参考日期的时间值,即2001年1月1日GMT的第一个时刻
NSDate本身没有任何时区概念。因此,NSDateFormatter做了正确的事情:它转换了一个日期,你告诉它有GMT偏移量(通过指定时区),并为你提供了该日期的"标准化"NSDate。
如果要查看欧洲/布达佩斯时区中表示的日期,请使用现有的日期格式器(-stringFromDate:)或适当的NSDate描述方法(例如-descriptionWithCalendarFormat:timeZone:locale:)。
附言-在编写的代码中根本不需要alloc/init。在非ARC中,这将是一个泄漏。
p.p.S.-你的日期格式不正确,结果毫无意义。我已经按照如下方式清理了您的代码(在ARC下测试):
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]);
两件事:
1) 您的日期格式字符串有错误。您应该使用MM
表示月份,而不是mm
(小写mm表示分钟)
2) 创建NSDate对象后,需要使用NSDateFormatter方法stringFromDate:
生成一个本地化到特定时区的日期字符串。如果您只是在NSDate对象上直接执行NSLog(),它将默认显示日期为GMT(GMT比布达佩斯时间晚一小时)