【问题标题】:iOS - Converting string to non-en-GB locale NSDate returns nil [duplicate]iOS - 将字符串转换为非 en-GB 语言环境 NSDate 返回 nil [重复]
【发布时间】:2013-01-15 10:58:58
【问题描述】:

可能重复:
NSString to NSDate

我有一个Mon Jan 14 14:00:00 CET 2013 格式的日期,我尝试将其转换为 NSDate:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"EEE MMM dd HH:mm:ss zzz y"];
NSString *dateString = @"Mon Jan 14 14:00:00 CET 2013"
NSDate *date = [df dateFromString:dateString];

但它不起作用,我的 datenil 输入数据是 en-GB 语言环境,我的设备的语言环境是 nb-NO

有什么建议吗?

【问题讨论】:

  • 看起来 dateFromString 已被贬低。看到这个SO answer
  • @NickThorne 是 NSDate 类方法而不是 NSDateFormatter 实例方法。

标签: iphone ios cocoa-touch nsdate nsdateformatter


【解决方案1】:

你的格式缺少一天:

[df setDateFormat:@"EEE MMM dd HH:mm:ss zzz y"];

如果不是拼写错误,那么下一步就是设置正确的语言环境,以便格式化程序能够识别 CET 时区,例如 en-GB 将修复该问题:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
// that will fix the problem with not recognized CET timezone
[df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en-GB"]];
[df setDateFormat:@"EEE MMM dd HH:mm:ss zzz y"];
NSString *dateString = @"Mon Jan 14 14:00:00 CET 2013"
NSDate *date = [df dateFromString:dateString];

【讨论】:

  • 这是一个错字 :-) 也不适用于 dd
  • 尝试设置 NSTimeZone *cet = [NSTimeZone timeZoneWithAbbreviation:@"Europe/Paris"]; [dateFormatter setTimeZone:cet];
  • 仍然返回 nil..这可能是在我当前的语言环境中 Mon 是 man 而 Jan 是 jan 的原因吗?
  • 不区分大小写,您使用的是哪个语言环境?
  • 无论如何,如果您使用 en-GB,那么 CET 会被识别,对于 en-US,它将无法被识别并返回 nil,我不确定您还能使用什么而不是 en -GB
【解决方案2】:

尝试使用此功能

 - (NSDate*) dateFromString:(NSString*)aStr
{

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    //[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss a"];
    [dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss a"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    NSLog(@"%@", aStr);
    NSDate   *aDate = [dateFormatter dateFromString:aStr];
    [dateFormatter release];
    return aDate;
}

希望对你有帮助。

【讨论】:

    【解决方案3】:

    我认为您的时区是错误的。只需使用此代码,它将完美运行:

        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"EEE MMM dd HH:mm:ss zzz y"];
        NSString *dateString = @"Mon Jan 14 14:00:00 EDT 2013";
        NSDate *date = [df dateFromString:dateString];
        NSLog(@"date :: %@",date);
    

    它将输出记录为:

    date :: 2013-01-14 18:00:00 +0000
    

    编辑:

    我为你找到了一些东西:NSDateFormatter doesn't parse some timezones

    您可以使用 en_GB Locale 解决此问题,如 Working with Date and Time in Cocoa 中所述:“这些缩写仍然适用于 en_GB 语言环境”。

    【讨论】:

    • 除了 OP 想要 CET 作为时区。
    【解决方案4】:

    CET 无法识别

    试试这个:-

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"EEE MMM dd HH:mm:ss yyyy"];
        NSString *dateString = @"Mon Jan 14 14:00:00 2013";
        NSDate *date = [df dateFromString:dateString];
        NSLog(@"%@",date);
    

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      简单地说,“CET”不是NSDateFormatter 认可的时区。

      此外,日期/时间已过指定,最好不要尝试包括日期或星期(星期一)。

      下面是一个示例,展示了具有可识别时区的工作代码:

      NSDateFormatter *df = [[NSDateFormatter alloc] init];
      [df setDateFormat:@"EEE MMM dd HH:mm:ss zzz yyyy"];
      NSString *dateString = @"Mon Jan 14 14:00:00 EST 2013";
      NSDate *date = [df dateFromString:dateString];
      NSLog(@"date: %@", date);
      

      NSLog 输出

      日期:2013-01-14 19:00:00 +0000

      NSLog(@"abbreviationDictionary: %@", [NSTimeZone abbreviationDictionary]);
      

      确实显示

      CET = "欧洲/巴黎";

      所以这看起来像是 NSDateFormatter 中的 Apple 错误。

      报告错误:Apple Bug Reporter

      【讨论】:

        【解决方案6】:

        你可以使用:

        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
        

        如果您仍想自定义日期格式,请尝试以下方式:

        yyyy-MM-dd HH:mm:ss ZZZ
        

        因为无法发明自己的格式化字符串语法并期望它能够工作;您需要实际使用文档中指出的格式:OS X v10.8 和 iOS 6.0 中的格式化程序使用版本 tr35-25。

        ->https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html

        如果你好奇:http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

        【讨论】:

          猜你喜欢
          • 2021-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          • 2017-07-20
          • 2018-08-12
          相关资源
          最近更新 更多