NSDateFormatter dateFromString 在 iOS 10 上工作,但在 iOS 11 上返回 nil
NSDateFormatter dateFromString working on iOS 10 but returning nil on iOS 11
我过去 2 年运行的内部应用程序有 messages dates
不同格式
1* Sep 20, 2017 at 8:09:39 PM
2* Feb 3, 2017, 5:49:42 PM
我正像这样将这些字符串转换为日期
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateStyle:NSDateFormatterMediumStyle];
[df setTimeStyle:NSDateFormatterMediumStyle];
[df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
return [df dateFromString:dtStr];
对于日期 1,它在 iOS 10 和 11
上完美运行
但对于日期 2,它仅适用于 iOS 10 而不适用于 iOS 11
我该如何解决这个问题?
所以看起来你更大的问题实际上是你有多种日期格式。
在此处查看 question/answer:
Converting mutliple date format into a single format in iPhone
它似乎没有那么有效...但它对你有用。它还使用其他人评论的特定日期格式。
这是针对您的问题的经过改编的答案:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *date1 = @"Sep 20, 2017 at 8:09:39 PM";
NSString *date2 = @"Feb 3, 2017, 5:49:42 PM";
NSLog(@"Date 1: %@", [self dateFromString:date1]);
NSLog(@"Date 2: %@", [self dateFromString:date2]);
}
- (NSDate *)dateFromString:(NSString *)dateString {
NSDate *date = nil;
// here, insert other date formats you know might be given
NSArray *dateFormatterList = @[
@"MMM d, y, hh:mm:ss a",
@"MMM d, y 'at' hh:mm:ss a"
];
if (dateString) {
for (NSString *dateFormatterString in dateFormatterList) {
[self.dateFormatter setDateFormat:dateFormatterString];
date = [self.dateFormatter dateFromString:dateString];
if (date) break;
}
}
return date;
}
- (NSDateFormatter *)dateFormatter {
if (!_dateFormatter) {
_dateFormatter = [[NSDateFormatter alloc] init];
}
return _dateFormatter;
}
@end
基本上发生的事情是......我们有一系列已知的日期格式。我们遍历每种格式并尝试从使用该格式的日期字符串中获取 NSDate。如果我们得到一个,我们 return 那一天。如果您有更多的日期格式,只需将其插入到 dateFormatterList 中即可。您会注意到我已经输入了两种日期格式:@"MMM d, y, hh:mm:ss a"
用于日期 1* 和 @"MMM d, y 'at' hh:mm:ss a" 用于上面的日期 2*。
我用你的两个日期测试了它,它有效。
日志:
Date 1: Wed Sep 20 20:09:39 2017
Date 2: Fri Feb 3 17:49:42 2017
请检查:
var dateStr = "Feb 3, 2017, 5:49:42 PM"
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:&error];
NSArray *matches = [detector matchesInString: dateStr options:0 range:NSMakeRange(0, [dateStr length])];
for (NSTextCheckingResult *match in matches) {
if (match.resultType == NSTextCheckingTypeDate) {
NSLog(@"%@", match.date);
}
}
Swift 4
var date = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
.matches(in: dateStr, range: NSRange(location: 0, length: dateStr.count))
.flatMap{[=11=].date}
print(date!)
我过去 2 年运行的内部应用程序有 messages dates
不同格式
1* Sep 20, 2017 at 8:09:39 PM
2* Feb 3, 2017, 5:49:42 PM
我正像这样将这些字符串转换为日期
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateStyle:NSDateFormatterMediumStyle];
[df setTimeStyle:NSDateFormatterMediumStyle];
[df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
return [df dateFromString:dtStr];
对于日期 1,它在 iOS 10 和 11
上完美运行但对于日期 2,它仅适用于 iOS 10 而不适用于 iOS 11
我该如何解决这个问题?
所以看起来你更大的问题实际上是你有多种日期格式。
在此处查看 question/answer: Converting mutliple date format into a single format in iPhone
它似乎没有那么有效...但它对你有用。它还使用其他人评论的特定日期格式。
这是针对您的问题的经过改编的答案:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *date1 = @"Sep 20, 2017 at 8:09:39 PM";
NSString *date2 = @"Feb 3, 2017, 5:49:42 PM";
NSLog(@"Date 1: %@", [self dateFromString:date1]);
NSLog(@"Date 2: %@", [self dateFromString:date2]);
}
- (NSDate *)dateFromString:(NSString *)dateString {
NSDate *date = nil;
// here, insert other date formats you know might be given
NSArray *dateFormatterList = @[
@"MMM d, y, hh:mm:ss a",
@"MMM d, y 'at' hh:mm:ss a"
];
if (dateString) {
for (NSString *dateFormatterString in dateFormatterList) {
[self.dateFormatter setDateFormat:dateFormatterString];
date = [self.dateFormatter dateFromString:dateString];
if (date) break;
}
}
return date;
}
- (NSDateFormatter *)dateFormatter {
if (!_dateFormatter) {
_dateFormatter = [[NSDateFormatter alloc] init];
}
return _dateFormatter;
}
@end
基本上发生的事情是......我们有一系列已知的日期格式。我们遍历每种格式并尝试从使用该格式的日期字符串中获取 NSDate。如果我们得到一个,我们 return 那一天。如果您有更多的日期格式,只需将其插入到 dateFormatterList 中即可。您会注意到我已经输入了两种日期格式:@"MMM d, y, hh:mm:ss a"
用于日期 1* 和 @"MMM d, y 'at' hh:mm:ss a" 用于上面的日期 2*。
我用你的两个日期测试了它,它有效。 日志:
Date 1: Wed Sep 20 20:09:39 2017
Date 2: Fri Feb 3 17:49:42 2017
请检查:
var dateStr = "Feb 3, 2017, 5:49:42 PM"
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:&error];
NSArray *matches = [detector matchesInString: dateStr options:0 range:NSMakeRange(0, [dateStr length])];
for (NSTextCheckingResult *match in matches) {
if (match.resultType == NSTextCheckingTypeDate) {
NSLog(@"%@", match.date);
}
}
Swift 4
var date = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
.matches(in: dateStr, range: NSRange(location: 0, length: dateStr.count))
.flatMap{[=11=].date}
print(date!)