Как разбирать строку даты в неизвестном формате на iPhone?
-
28-09-2019 - |
Вопрос
Как я могу анализировать строку, которая представляет дату и / или время, используя iPhone SDK, если я не знаю формата? Я создаю приложение, которое позволит использовать диапазон возможных дат и времени, и я не хочу, чтобы это не удалось, потому что формат был «01/01/2001» вместо «01-01-2001», и т. Д. , Время может или не может быть включено.
Есть какой-либо способ сделать это? Я попробовал использовать NSDateFormatter с стилями даты и времени, установленным на «Nostyle», и Setlenient = Да, но он все еще не удается разбирать простейших строк: «1/22/2009 12:00:00 вечера».
У меня нет способа познакомиться с форматом заранее, мне нужен метод, который будет эристерически определять формат.
Я иду с фона .NET, где это так просто, как новое значение dateTime (string_in_any_format); Но я понятия не имею, как это сделать в OBJ-C.
Решение
К сожалению, NSDateFormatter
на iPhone не тот умная. Вам нужно дать ему небольшое руководство. Когда вы устанавливаете как стили даты и времени, чтобы NoStyle
Ожидается, что не видит ни дату, ни время. Вам понадобится хотя бы один из них, установленный на другой стиль. Вы можете сделать что-то вроде следующего, и он должен работать нормально (это делает для меня).
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
[formatter setLenient:YES];
NSDate * date = [formatter dateFromString:@"01-01/2001"];
NSLog(@"%@", date);
Другие советы
Старый пост, но есть лучшие способы справиться с этим, что я нашел на других постах.
Вы можете использовать такой метод:
- Во-первых, попробуйте и разбирайте дату в паре ожидаемых форматов.
- Если это не работает, используйте
NSDataDetector
Чтобы попытаться найти информацию о дате (ссылка: Это так пост).
Вот образец кода, который я использовал для этого (я ожидал, что форматы пары даты, но не могли быть уверены, что единственная дата, которую я когда-либо видел и не хотел потерпеть неудачу, если это возможно):
// your date formats may vary, the OP might try "MM/dd/yyyy" and "MM-dd-yyyy", along with combos that include time info
NSArray *dateFormatsToTry = @[@"yyyy-MM-dd'T'HH:mmZZZZ", @"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
for (NSString * format in dateFormatsToTry) {
[dateFormatter setDateFormat:format];
NSDate *date = [[[self class] sharedDateFormatter] dateFromString:dateString];
if (date) {
return date;
}
}
// try and figure out the date if the all of the expected formats failed to
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:nil];
NSTextCheckingResult *result = [detector firstMatchInString:dateString options:0 range:NSMakeRange(0, [dateString length])];
if ([result resultType] == NSTextCheckingTypeDate) {
NSDate * date = [result date];
if (date) {
return date;
}
}
return [NSDate date]; // default to now :(
Как бы ваш потенциальный анализатор определяет ли 01/02/10 2 января 2010 года; 1 февраля 2010 года; или что-то совершенно другое? BBOTH MM / DD / YY и DD / MM / YY являются разумными для ожидания, в зависимости от того, где ваши клиенты.