代码之家  ›  专栏  ›  技术社区  ›  Blaire Crits-Christoph

如何在iOS中使用NSISO8601DateFormatter从字符串中解析日期?

  •  0
  • Blaire Crits-Christoph  · 技术社区  · 2 年前

    我一辈子都不明白为什么 dateFromString 在下面的代码中产生了一个零值。

    NSString* timeStampValue = @"20230917120009.289Z";
        NSString* dateString = [timeStampValue substringToIndex:8];
        NSISO8601DateFormatter* formatter = [[NSISO8601DateFormatter alloc] init];
        [formatter setFormatOptions:NSISO8601DateFormatWithFullDate];
        NSDate* dateOfLastVerification = [formatter dateFromString:dateString];
    

    首先我尝试转换整个字符串 timeStampValue 并相应地设置格式选项。我希望它能起作用,因为据我所知,这个字符串是有效的ISO8601格式。从技术上讲,它使用了GeneralizedTime语法,但这似乎并不重要。但那投了一个零分球。

    然后我决定只提取日期子字符串(我不一定需要时间和时区数据),并指定NSISO8601DateFormatWithFullDate作为唯一选项。这应该是我最安全的赌注,对吧?在那个场景中,dateFromString也抛出了nil。我尝试直接在格式化程序上设置格式选项,但没有什么不同:

    formatter.formatOptions = NSISO8601DateFormatWithFullDate
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   HangarRash    2 年前

    “此字符串的格式为有效的ISO8601” -实际上,没有。要使其有效,您需要 T 日期和时间之间。有效字符串为:

    NSString* timeStampValue = @"20230917T120009.289Z"; // Note the added T
    

    即便如此,您也需要非常具体的格式选项来正确识别字符串。您需要以下选项:

    • NSISO 8601随年份的日期格式
    • NSISO 8601随月数据格式
    • NSISO 8601带日期的日期格式
    • NSISO 8601随时间的日期格式
    • NSISO 8601以小数秒为单位的日期格式
    • NSISO 8601带时区的日期格式

    如果将所有这些选项应用于 formatOptions 属性,同时添加所需的 T 在该字符串中,您将能够将该字符串转换为 NSDate

    NSString* timeStampValue = @"20230917T120009.289Z";
    NSISO8601DateFormatter* formatter = [[NSISO8601DateFormatter alloc] init];
    formatter.formatOptions = NSISO8601DateFormatWithYear | NSISO8601DateFormatWithMonth | NSISO8601DateFormatWithDay | NSISO8601DateFormatWithTime | NSISO8601DateFormatWithFractionalSeconds | NSISO8601DateFormatWithTimeZone;
    NSDate* dateOfLastVerification = [formatter dateFromString:timeStampValue];
    

    请注意,为了使用 NSISO8601DateFormatWithFullDate ,字符串的日期格式必须为“yyyy-MM-dd”。如果这是您指定的唯一选项,那么字符串只能包含日期,而不能包含其他内容。


    如果您想使用 NSISO8601DateFormatter 无需指定任何格式选项,字符串的格式需要为“yyyy-MM-ddTHH:MM:ssZZZZZ”。


    在解决解析日期字符串的问题时,一种有用的调试技术是查看转换 NSDate 变成 NSString 使用日期格式化程序。如果结果输出与您试图解析的输入不匹配,那么您就知道您有错误的格式选项或无效的输入字符串。

    推荐文章