Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSDateFormatter:如何使用';格林尼治标准时间';到什么时候?_Objective C_Ios_Nsdate_Nsdateformatter - Fatal编程技术网

Objective c NSDateFormatter:如何使用';格林尼治标准时间';到什么时候?

Objective c NSDateFormatter:如何使用';格林尼治标准时间';到什么时候?,objective-c,ios,nsdate,nsdateformatter,Objective C,Ios,Nsdate,Nsdateformatter,我需要将从服务器检索到的日期字符串转换为本地NSDate,该字符串如下所示: "Fri, 30 Nov 2012 00:35:18 GMT" 但是现在是11月30日星期五上午11:36,那么如何将字符串转换为有意义的本地日期呢 我发现: 但是看起来情况正好相反。只需将NSDateFormatter与格式化字符串eee,dd-MMM-yyy-HH:mm:ss-zzz一起使用即可。末尾的Zs使它从字符串中读取时区 因此,给定示例代码: NSLocale *usLocale = [[[NSLoca

我需要将从服务器检索到的日期字符串转换为本地NSDate,该字符串如下所示:

"Fri, 30 Nov 2012 00:35:18 GMT"
但是现在是11月30日星期五上午11:36,那么如何将字符串转换为有意义的本地日期呢

我发现:


但是看起来情况正好相反。

只需将
NSDateFormatter
与格式化字符串
eee,dd-MMM-yyy-HH:mm:ss-zzz
一起使用即可。末尾的Zs使它从字符串中读取时区

因此,给定示例代码:

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setLocale:usLocale];
[formatter setDateFormat:@"eee, dd MMM yyyy HH:mm:ss zzz"];
_createdAt = [formatter dateFromString:dateString];

请注意,NSDate始终在内部以GMT格式存储日期。然后使用日期格式化程序在本地时区中创建字符串。在本例中,您是从字符串开始的,因此首先需要使用日期格式化程序创建日期,然后再次使用它在本地时区(未指定时区时默认为该时区)中创建字符串


在我问题的链接中,他使用了
NSTimeZone*gmt=[NSTimeZone TimeZoneWithabRevision:@“gmt”];[日期格式化程序设置时区:gmt]
为什么不需要它?您不需要它,因为您的字符串在其中指定了GMT,并且您设置的日期格式的
zzz
组件将告诉
NSDateFormatter
使用您的字符串指定的内容,而不是它认为的标准。Oops;我的回答有误+1.尽管您仍应明确设置区域设置-否则,
NSDateFormatter
保留修改精确格式字符串的权利。@Tommy:如果我没有弄错,区域设置默认为您当前的区域设置。我只记录了dateFormatter.locale.localeIdentifier(没有设置),它给了我“en_US”,这是我当前的语言环境。这就是为什么我没有设置它,因为他希望它位于他的本地时区。@lnafziger区域设置和时区是独立的属性。使用固定格式的日期/时间字符串时,使用locale
en_US_POSIX
非常重要。如果没有它,格式可能会根据用户的24小时设置(例如)在背后更改。设置区域设置对格式的时区没有影响。请看@Tommy在回答中提到的QA1480。@rmaddy:我不明白你想表达的意思。我创建的日期格式化程序上的区域设置默认为
en\u US
。如果我要向用户显示此字符串,我希望它尊重用户的24小时设置以及指定的任何其他内容。当我从日期格式转换(如本例中所示)时,日期格式指定了预期的格式,用户在其首选项中指定了什么并不重要。。。。我有什么误解吗???@lnafziger如果你需要一个精确的格式,你需要设置en_US_POSIX语言环境。创建适应各种设置的用户格式时,请保留默认区域设置。
NSString *dateString           = @"Fri, 30 Nov 2012 00:35:18 GMT";

NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat       = @"EEE, dd MM yyyy HH:mm:ss zzz";

NSDate *date                   = [dateFormatter dateFromString:dateString];
NSString *localDateString      = [dateFormatter stringFromDate:date];

NSLog(@"%@", localDateString);
// Results:  Thu, 29 11 2012 19:35:18 EST