gpt4 book ai didi

ios - 如何以编程方式检查字符串的日期格式以确保格式正确

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:27:10 24 4
gpt4 key购买 nike

以这个时间戳为例。 1993-11-14T00:00:00.000Z

我曾尝试使用以下日期格式来尝试将字符串转换为 NSDate 对象,但我一直失败,因为我没有提供正确的格式。无论如何进行程序检查,也许是一个解析器会自动为我执行此操作?

NSDateFormatter *inputDateFormat = [[NSDateFormatter alloc] init];
//Not correct format
[inputDateFormat setDateFormat:@"yyyy-MM-ddTHH:mm:ssZ"];
self.usersBirthDate = [inputDateFormat dateFromString:[dictionary objectForKey:@"birth_date"]];

最佳答案

您应该识别并使用正确的格式字符串。在这种情况下,正确的格式字符串是:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

请注意,T 周围的单引号并在末尾添加 .SSS 毫秒。顺便说一句,不要忘记按照 Technical Q&A QA1480 中的讨论设置 locale .


在回答您的问题时,一个有前途的替代方法是将 NSDataDetectorNSTextCheckingTypeDate 类型一起使用。令人惊讶的是,它实际上捕获了相当多的 ISO 8601/RFC 3339 日期排列。遗憾的是,它无法处理毫秒级的排列。

不过,编写一个执行您描述的例程并不难。您可以使用正则表达式,例如像这样的东西:

- (NSDate *)dateFromString:(NSString *)string {
static NSArray *formatStrings = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatStrings = @[@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss.SSS"},
@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss"},
@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss.SSSZ"},
@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ssZ"},
@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[A-Z]{3}$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ssz"},
@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2} [A-Z]{3}$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss z"},
@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2} [+|-]\\d{4}$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss Z"}];
});

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
for (NSDictionary *dictionary in formatStrings) {
if ([string rangeOfString:dictionary[kDateFormatRegex] options:NSRegularExpressionSearch].location != NSNotFound) {
formatter.dateFormat = dictionary[kDateFormatString];
return [formatter dateFromString:string];
}
}

return nil;
}

综上所述,这似乎是一个非常低效的过程:让我印象深刻的是,如果知道您的 Web 服务将为日期采用哪种格式并为此使用适当的格式字符串,会好得多。但是如果你想以编程方式检测模式,你可以使用上面的正则表达式。只需扩展 formatStrings 的字典以包含您关心的所有可能的排列。

关于ios - 如何以编程方式检查字符串的日期格式以确保格式正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558949/

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