何时为NSDateFormatter设置NSLocale?

时间:2018-04-20 16:55:49

标签: ios nsdate nsdateformatter nslocale

在我的应用程序中,我使用以下代码将字符串转换为日期,然后将日期插入数据库。

但是,对于英国用户而言,此代码失败,他们将Region设置为UK,Timezone设置为London。

这适用于美国的用户,因为他们的语言环境是en_US。这就是说,这段代码适用于en_US语言环境,但不适用于en_GB语言环境。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T1'HH-mm-ss-SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; //doing this as timestamp stored in server is based on UTC, hence I'm using UTC instead of systemTimeZone
 date = [dateFormatter dateFromString:theDate];

传递的字符串是:2014-6-26T121-21-6-000

如果我为世界各地的所有用户设置了以下语言环境,而不是currentLocale:

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

然后代码可以运行,但我想知道这是否会导致将来出现任何问题?

为什么我们需要设置locale属性来转换日期?

为什么currentLocale在我的案例中失败但在en_US语言区失败,即使日期格式匹配正确?

1 个答案:

答案 0 :(得分:1)

每当您处理ISO 8601或RFC 3339日期(即与Web服务交换的日期和/或在某些数据存储中存储为字符串)时,请使用en_US_POSIX。请参阅Technical Note 1480

或者可以使用NSISO8601DateFormatter并且您不必处理此区域设置愚蠢。 E.g。

NSString *string = @"2014-06-26T12:21:06.000Z";

NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
formatter.formatOptions = NSISO8601DateFormatWithInternetDateTime | NSISO8601DateFormatWithFractionalSeconds;

NSDate *date = [formatter dateFromString:string];

此外,ISO 8601和RFC 3339日期时间字符串的标准表示,您通常使用2014-06-26T12:21:06.000Z之类的格式,其中:

  • 小时小于24;
  • 数字为零填充;
  • 小时与分钟和秒之间的分隔符为:;
  • 秒与毫秒之间的分隔符为.;和
  • 您经常在字符串的末尾添加Z,以明确指定时间字符串是GMT / UTC / Zulu。