gpt4 book ai didi

NSDateFormatter 和时区格式为 "+HH:mm"的字符串

转载 作者:行者123 更新时间:2023-12-04 15:36:46 27 4
gpt4 key购买 nike

更新
从 iOS 7 开始,NSDateFormatter 在以这种格式显示字符串时确实会创建一个 NSDate:

NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ""];

NSLog(@"non–nil date, even honoring the 7–minute–offset in the time–zone on iOS 7: %@",
[formatter dateFromString:@"2011-07-12T18:07:31+02:07"]);
对于 iOS 6,答案是不要使用 NSDateFormatter…

好的,到目前为止我已经阅读了
  • Docs
  • Technotes在 Apple,
  • the Unicode reference的重要组成部分和
  • 这里有不少问题和答案

  • 关于如何使用 NSDateFormatter为了创建一个 NSDate从一个字符串中。
    我偶然发现了 Peter Hosey 的 ISO8601DateFormatter ,同样。
    看着他的实现,我想知道:
    有没有一种既正确又理智的方法来获得这样的字符串 2011-07-12T18:07:31+02:00NSDate ?
  • 如果最后一个冒号丢失了也没有问题。
  • 如果有GMT就没有问题了前缀“+”-符号,但是...
  • 事实并非如此。

  • 我可以破解它来为我的应用程序工作(使用格式 @"yyyy'-'MM'-'dd'T'HH':'mm':'ssz':'00" )但那当然是 不正确 因为它会丢弃时区的分钟信息。
    我也可以用空字符串替换最后一个冒号,但我也会认为这是一种黑客攻击。
    那么,有什么秘诀可以做 NSDateFormatter从上面取出那个字符串并给我一个有效且正确的 NSDate ?

    在旁边:
    我在某处找到了提示,可以使用 +[NSDate dateWithNaturalLanguageString:]以实现我的目标。然而,这只是设置日期,而不是时间! (好吧,它确实设置了时间,但只考虑了时区偏移,而不是 HH:mm:ss 部分......)

    最佳答案

    这个问题有点老了,但我遇到了同样的问题。我想出了一些代码,这是一个答案,可能对其他人有用......

    我使用正则表达式来解析 ISO-8601 字符串并将输出抓取到一堆字符串中,然后您可以使用它来创建自己的字符串以传递给 NSDateFormatter(即删除冒号等),或者如果您总是想要相同的输出字符串,只需从调用 NSRegularExpression 的结果中创建它。

    //    ISO-8601 regex: 
    // YYYY-MM-DDThh:mm[:ss[.nnnnnnn]][{+|-}hh:mm]
    // Unfortunately NSDateFormatter does not parse iso-8601 out of the box,
    // so we need to use a regex and build up a date string ourselves.
    static const char * REGEX_ISO8601_TIMESTAMP =
    "\\A(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})" // Mandatory - YYYY-MM-DDThh:mm
    "(?:"
    ":(\\d{2})" // Optional - :ss
    "(?:"
    "[.](\\d{1,6})" // Optional - .nnnnnn
    ")?"
    ")?"
    "(?:"
    "([+-])(\\d{2}):(\\d{2})|Z" // Optional -[+-]hh:mm or Z
    ")?\\z";

    // Extract all the parts of the timestamp
    NSError *error = NULL;
    NSString *regexString = [[NSString alloc] initWithUTF8String:REGEX_ISO8601_TIMESTAMP];

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString
    options:NSRegularExpressionCaseInsensitive
    error:&error];

    NSArray *matches = [regex matchesInString:timestamp
    options:0
    range:NSMakeRange(0, [timestamp length])];

    // Groups:
    //
    // elements start at 1 in the array returned from regex, as [0] contains the original string.
    //
    // MANDATORY - must exist as per ISO standard
    // 1 - YYYY
    // 2 - MM
    // 3 - DD
    // 4 - hh
    // 5 - mm
    // OPTIONAL (each one can be optional)
    // 6 - ss
    // 7 - nn (microseconds)
    // 8 - offset sign (+/-)
    // 9 - offset hour
    // 10 - offset min
    // put the parts into a string which will then be recognised by NSDateFormatter
    // (which is acutally RFC822 format)

    // mandatory init'd to nil, optional set to defaults.
    NSString *YYYY, *MM, *DD, *hh, *mm, *ss, *nn, *sign, *Zhh, *Zmm;
    NSRange tempRange;

    for (NSTextCheckingResult *match in matches) {
    NSRange matchRange = [match range];
    NSInteger matchCount = [match numberOfRanges] - 1;
    NSUInteger idx = 1;

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    YYYY = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    MM = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    DD = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    hh = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    mm = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    ss = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    nn = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    sign = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    Zhh = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }

    if (idx < matchCount) {
    tempRange = [match rangeAtIndex:idx++];
    Zmm = tempRange.location != NSNotFound ? [timestamp substringWithRange:tempRange] : nil;
    }
    }

    希望这可以帮助某人!

    关于NSDateFormatter 和时区格式为 "+HH:mm"的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667829/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com