Как проанализировать продолжительность ISO 8601 в Objective C?

Это, конечно, не о "сеансовых ключах", поскольку это обычно используется для обращения к sessionless аутентификации, которая выполняется в рамках всех ограничений REST. Каждый запрос самоописывает, содержа достаточно информации для авторизации запроса самостоятельно без любого состояния приложения серверной стороны.

самый легкий способ приблизиться к этому путем запуска со встроенных механизмов аутентификации HTTP в RFC 2617 .

14
задан dlamblin 18 July 2009 в 06:49
поделиться

2 ответа

Если вы точно знаете, какие поля вы получите, вы можете использовать один вызов sscanf () :

const char *stringToParse = ...;
int days, hours, minutes, seconds;
NSTimeInterval interval;
if(sscanf(stringToParse, "P%dDT%dH%dM%sS", &days, &hours, &minutes, &seconds) == 4)
    interval = ((days * 24 + hours) * 60 + minutes) * 60 + seconds;
else
    ; // handle error, parsing failed

Если какое-либо из полей может быть опущено, вам нужно быть немного умнее в вашем синтаксическом анализе, например:

const char *stringToParse = ...;
int days = 0, hours = 0, minutes = 0, seconds = 0;

const char *ptr = stringToParse;
while(*ptr)
{
    if(*ptr == 'P' || *ptr == 'T')
    {
        ptr++;
        continue;
    }

    int value, charsRead;
    char type;
    if(sscanf(ptr, "%d%c%n", &value, &type, &charsRead) != 2)
        ;  // handle parse error
    if(type == 'D')
        days = value;
    else if(type == 'H')
        hours = value;
    else if(type == 'M')
        minutes = value;
    else if(type == 'S')
        seconds = value;
    else
        ;  // handle invalid type

    ptr += charsRead;
}

NSTimeInterval interval = ((days * 24 + hours) * 60 + minutes) * 60 + seconds;
6
ответ дан 1 December 2019 в 07:41
поделиться

Я нашел в этой статье Википедии ссылку на то, как на самом деле работает ISO-8601. Я не эксперт по какао, но держу пари, если вы сможете проанализировать эту строку и извлечь компонентный час, минуту, секунду, день и т. Д., Получить ее в NSTimeInterval должно быть легко. Сложная часть - это разобрать. Я бы сделал это примерно так:

Во-первых, разделил бы строку на две отдельные строки: одна представляет дни, а вторая - время. NSString имеет метод экземпляра componentsSeparatedByString: NSString, который возвращает NSArray подстрок исходного NSString, разделенных переданным вами параметром. Это будет выглядеть примерно так:

NSString* iso8601 = /*However you're getting your string in*/
NSArray* iso8601Parts = [iso8601 componentsSeparatedByString:@"T"];

Затем выполните поиск первого элемента iso8601Parts для каждого возможного дня индикаторы продолжительности (Y, M, W и D). Когда найдешь, захватить все предыдущие цифры (и, возможно, десятичную точку), преобразовать их в число с плавающей запятой и где-нибудь сохранить. Помните, что если был только элемент времени, то iso8601Parts [0] будет пустой строкой.

Затем проделайте то же самое, ища части времени во втором элементе iso8601Parts для возможных индикаторов времени (H, M, S ). Помните, что если был только дневной компонент (то есть в исходной строке не было символа 'T'), тогда iso8601Parts будет иметь длину только один, и попытка доступа ко второму элементу вызовет исключение за пределами .

NSTimeInterval - это просто длительное хранение нескольких секунд, поэтому преобразуйте отдельные фрагменты, которые вы вытащили, в секунды, сложите их вместе, сохраните их в своем NSTimeInterval, и все готово.

Извините, я знайте, что вы просили "простой" способ сделать это,

0
ответ дан 1 December 2019 в 07:41
поделиться