【问题标题】:How to parse these time zones with NSDateFormatter?如何使用 NSDateFormatter 解析这些时区?
【发布时间】:2012-12-28 01:57:06
【问题描述】:

我正在解析大量互联网日期。首先我尝试使用en_US_POSIX 语言环境的格式化程序,然后使用en_GB。代码看起来或多或少是这样的:

{
    NSDate *date = [dateString dateWithDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z (zzz)" localeIdentifier:@"en_US_POSIX"];
    if (date) return date;
    date = [dateString dateWithDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z (zzz)" localeIdentifier:@"en_GB"];
    return date;
}

- (NSDate*) dateWithDateFormat:(NSString*)dateFormat localeIdentifier:(NSString*)localeIdentifier
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
    formatter.dateFormat = dateFormat;
    [formatter dateFromString:self];
}

但是,具有以下时区的日期字符串无法解析:

Mon, 16 Jul 2012 12:08:17 +0100 (GMTUK)
Thu, 6 Sep 2012 13:00:06 +0900 (KST)
Wed, 3 Nov 2010 10:12:15 +0100 (Hora est�ndar romance)
Wed, 14 Sep 2011 14:37:35 +0100 (IST)
Wed, 2 May 2012 09:41:06 +0200 (MEST)
Sun, 31 Oct 2010 12:53:06 +0800 (SGT)
Thu, 19 Jan 2012 08:34:44 -0300 (UYT)

我做错了什么?

我应该只在这些情况下预处理字符串以删除时区括号吗?

【问题讨论】:

  • 如果删除时区或时间戳,会更简单,但可能会丢失时间戳!!!

标签: iphone ios macos nsdate nsdateformatter


【解决方案1】:

NSDate 可以存储一个没有时区信息的时间点。由您的软件决定特定的NSDate 实例是以UTC 还是本地时区存储时间点。在大多数情况下,您希望使用 UTC 日期。

因此,在解析日期时处理时区差异很重要。但无法记住日期最初所在的时区(至少对于 NSDate 实例而言是这样)。

所以我建议你把括号中的时区去掉,只解析它之前的数字时区偏移量。这样,您可以将所有字符串转换为 UTC 格式的 NSDate 实例,并且解析字符串不会有任何问题。

日期不应该是(即数字时区偏移的大写 Z)吗?

@"EEE, dd MMM yyyy HH:mm:ss ZZZ"

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2011-12-24
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多