【问题标题】:NSDateFormatter iOS, date patternNSDateFormatter iOS,日期模式
【发布时间】:2012-06-22 23:11:13
【问题描述】:

我只是不知道如何设置 NSDateFormatter 日期格式,因此 [formatter dateWithString:] 不会返回 nil。

日期如下:

2008-08-18T14:32:22.1875000+01:00

我试过了

formatter setDateFormat:@"yyyy-MM-ddTHH:mm:ss.fffffffzz+GMT"];

似乎不起作用:(。任何建议,请帮助。

好的,感谢您的回答,我的问题似乎有点误导了人们,所以我尝试重新措辞,对此感到抱歉,也许编程有点晚了。我需要一个日期包装对象,所以我不必自己解析包含日期的字符串。基本上,我从需要解析的数据库中获取一个字符串,以便可以在我的 UI 中使用它。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZZZZ";
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSDate *date = [formatter dateFromString:@"2008-08-18T14:32:22.1875000+01:00"];
NSLog(@"%@", date);

打印 nil

我想要的是 NSString->NSDat,所以我可以问它包含什么月份,或者它包含什么时间。我现在看到 NSDate 没有这种方法。假设这是一件愚蠢的事情。现在有什么想法吗?

【问题讨论】:

    标签: ios date formatter


    【解决方案1】:

    根据unicode documentation,没有 f。假设你想要亚秒,那应该是 S。如果您希望按字面意思传输,还需要将 T 放在引号中。我认为您也对 z 感到困惑,并且可能想要 ZZZZ 而不是 zz+GMT。所以:

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZZZZ";
    NSLog(@"%@", [formatter stringFromDate:[NSDate date]]);
    

    根据QA1480,如果您想生成用于存储的技术字符串,您可能还需要明确设置en_US_POSIX 的语言环境。假设您要显示字符串,它保留根据当前语言环境调整您请求的字段的权利。那就是:

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    formatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
    formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZZZZ";
    NSLog(@"%@", [formatter stringFromDate:[NSDate date]]);
    

    根据 ctrahey 的回答,这并不能完全得到您想要的格式,最终例如

    012-06-22T16:44:32.9310000GMT-07:00
    

    即'GMT' 的字母已经悄悄进入了那里。切换到单个 Z 会消除对 GMT 的显式引用,但也会删除冒号。

    编辑:根据您的示例代码:

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
    formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZZZZ";
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    NSDate *date = [formatter dateFromString:@"2008-08-18T14:32:22.1875000+01:00"];
    NSLog(@"%@", date);
    

    这会失败,因为您的输入字符串与提供的日期格式不匹配 - 它在 +01:00 之前缺少字母 GMT。由于似乎没有与数据库中的内容完全匹配的 unicode 日期字符串,因此最简单的方法可能就是删除冒号。例如

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
    formatter.dateFormat = @"yyyy-MM-dd'T'HHmmss.SSSSSSSZ";
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    NSString *sourceString = @"2008-08-18T14:32:22.1875000+01:00";
    NSDate *date = [formatter dateFromString:[sourceString stringByReplacingOccurrencesOfString:@":" withString:@""]];
    NSLog(@"%@", date);
    

    对我来说输出2008-08-18 13:32:22 +0000

    【讨论】:

    • 我更新了这个问题,所以也许你现在也可以帮助我:D 另外你为什么要自动释放对象?我使用的是 ARC,所以我不需要这样做,对吧?
    • @foFox,正确。您不需要(实际上不能)在 ARC 代码中使用 autorelease。但是,出于各种原因,有些人仍然需要使用非 ARC 代码。
    【解决方案2】:

    我能得到的最接近的只是在接近末尾的区域偏移中去掉冒号:

    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"];
    

    看起来像这样:2012-06-22T16:40:46.6290000-0700

    我使用的文档is here,链接from Apple

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2016-10-10
      • 2023-04-01
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多