2012-01-15 76 views
15

我必须从objective-c中的NSString初始化一个NSDate对象。我不喜欢这样写道:为什么我的时区不能保存到我的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,即使我将其时区设置为“欧洲/布达佩斯”。我该如何解决这个问题?

谢谢!

回答

14

两件事:

1)您的日期格式字符串中有错误。您应该使用MM为一个月,不mm(小写毫米为分钟)

2)创建你的NSDate对象之后,你就需要使用NSDateFormatter方法stringFromDate:产生定位于一个特定的时区的日期字符串。如果你只是做一个直的NSLog()上的NSDate对象,它会显示默认的日期为格林尼治标准时间(GMT背后是布达佩斯时间一小时)相对于标准基准日

+0

非常感谢! – Tom 2012-01-15 01:11:24

+0

那么这意味着如果我有一个时区,我不能将日期存储到具有该时区的NSDate对象中?我将不得不在显示的时候在其他地方和用户存储时区? – Nil 2016-06-15 07:41:17

27

的NSDate日期存储。来自课堂文档:

“NSDate的唯一基本方法timeIntervalSinceReferenceDate为NSDate接口中所有其他方法提供了基础,该方法返回相对于绝对引用日期的时间值 - 第一个1格林威治标准时间2001年1月

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

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

P.S.-书面你不需要的分配/在你的代码在所有的初始化。在非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]); 
+0

所以NSdate没有时区的概念。但它有GMT概念?我不能将时区转换为GMT小时并将其添加到NSDate对象? – Nil 2016-06-15 07:43:21

相关问题