NSDateFormatter dateFromString在iOS 10上运行,但在iOS 11上返回nil

时间:2017-09-20 17:22:31

标签: ios objective-c nsdate nsdateformatter

我最近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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

所以看来你的更大问题实际上是你有多种日期格式。

在此处查看此问题/答案: 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。如果我们得到一个,我们将返回该日期。如果您有更多日期格式,只需将其插入dateFormatterList即可。您会注意到我已经输入了两个日期格式:{1}代表日期1 *和@" MMM d,y' at' hh:mm:ss a"日期2 *以上。

我用你的两个日期测试了它并且它有效。 日志:

@"MMM d, y, hh:mm:ss a"

Date 1: Wed Sep 20 20:09:39 2017

答案 1 :(得分:1)

请检查:

Date 2: Fri Feb  3 17:49:42 2017

Swift 4

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);
    }
}