Как разбирать строку даты в неизвестном формате на iPhone?

StackOverflow https://stackoverflow.com/questions/3485209

  •  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 являются разумными для ожидания, в зависимости от того, где ваши клиенты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top