【问题标题】:IOS6 Incorrect TimeZone while converting date from string to NSDate将日期从字符串转换为 NSDate 时 IOS6 时区不正确
【发布时间】:2013-07-16 14:58:56
【问题描述】:

我的日期格式

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

当我将其转换为 NSDate 日期格式为 IST 或 GMT +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];

【问题讨论】:

    标签: objective-c ios6 nsdate date-conversion


    【解决方案1】:

    您需要将格式化的语言环境设置为en_US_POSIX 以强制它使用提供的时区而不是系统时区:

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

    【讨论】:

    • 没有任何区别
    【解决方案2】:

    您正在正确解析日期字符串(在 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 对象。

    【讨论】:

    • 必须有办法解决这个问题。我不想在我有时区硬编码值的地方实施黑客攻击,然后我比较数据......这将是最后的解决方案......然后我也可能不想去那里......
    • -4:00 代表服务器时间......并且要求是这样我必须显示那个时区......
    • @PeyushGoel 明白了。如果您想始终在-4:00 时区显示日期,这很容易(只需在输出NSDateFormatter 中使用该时区)。但我认为某些日期将在 -4:00 时区中,而其他日期将在时区中,例如 -7:00 时区,您希望在原始日期字符串的时区中显示它们(例如 @987654339 @ v PDT) 基于在该原始字符串中捕获的时区。不幸的是,NSDate 根本不会捕获时区,因此如果您需要保存时区,则需要手动进行。
    • 通常只有一种格式,但也可以是多种格式。但我会从服务器获得-4:00 或-7:00 的值。那部分很清楚。不清楚的是我应该如何将它与 NSDateFormatter 一起使用。上述方法(在我的问题中)以我的系统时间返回日期,即 IST
    • @PeyushGoel 不要分裂头发,但它不会在您的系统时间返回NSDate(因为NSDate 不了解时区)。它只是返回没有时区的日期。但是,当您检查NSDate 的内容时,默认情况下,它会以系统的默认时区显示给您。但是,如果您愿意,您可以手动设置NSDateFormattertimeZone 属性,例如dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:-4.0 * 60.0 * 60.0]; 然后查看[dateFormatter stringFromDate:date],它应该会以GMT-4:00 格式显示给您。
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多