2013-07-16 19 views
1

我的日期格式iOS6的不正确的时区,而从字符串转换日期的NSDate

2013-07-16T07:40:36.939-04:00

当我把它转换成一个NSDate的 日期格式为IST或格林威治标准时间+5:30,因为我在印度。我应该如何使用-4:00作为时区,并根据数字显示EST或PDT。如果我使用zzz,则返回GTM + 5:30,zzzz返回印度标准时间。这是我的方式

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSzzz"]; 
NSDate *date = [dateFormatter dateFromString:strDate]; 

回答

1

您需要格式化的区域设置为en_US_POSIX,迫使它使用提供的时区,而不是系统时区:

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 
+0

没有任何区别 –

1

你正确地解析日期字符串(在iOS 6及更高版本中;这不是在iOS 5中识别的日期格式,它识别-0400GMT-04:00,但不是-04:00)。不幸的是,NSDate对象没有“时区”,因此信息不会被NSDateFormatter捕获。

如果您确实想要捕获原始时区,我认为您可能需要为最后几个字符(-04:00)手动解析字符串,从中确定时区偏移量,并将其存储在单独的字段中,以及何时输出日期,请使用此单独的时区偏移量来相应地设置日期格式化程序的timeZone属性。或者,如果您确实想要表示原始日期,则可以将此ISO8601日期字符串重新格式化为对人类友善的字符串,并保留此相当字符串(以及NSDate对象,据推测)。

顺便说一句,分裂毛发,但你可能想要保持谨慎,假设-04:00将代表EDT,因为(a)它取决于一年的时间;和(b)还有其他时区也是-04:00(例如南美洲的时区也是-04:00)。

通常,应用程序完全避免了这个问题:(a)将日期字符串转换为NSDate对象;和(b)使用运行该应用程序的设备的时区和区域设置输出这些NSDate对象。

+0

必须有一种方法来解决这个问题。我不想实施黑客,我有硬编码值的时区和我比较数据...这将是最后的解决方案...然后我也可能不想去那里... –

+0

-4:00代表服务器时间...和要求是这样,我必须显示该时区... –

+0

@PeyushGoel了解。如果您想始终在'-4:00'时区显示日期,那很简单(只需在您的输出中使用该时区'NSDateFormatter')。但我认为有些日期将会在'-4:00'时区以及其他时区,例如'-7:00'时区,并且您想要在原始时区显示它们日期字符串(例如'EDT' v'PDT'),以该原始字符串中捕获的时区为基础。不幸的是,'NSDate'根本不会捕获时区,所以如果您需要保存时区,则需要手动执行。 – Rob

相关问题