iOS - как сравнить два формата ISO 8601? - PullRequest
0 голосов
/ 16 декабря 2011

Я хочу проверить, является ли время, например "2011-03-29T15: 57: 02.680-04: 00", до текущего времени. Как бы я поступил так?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Отличительной особенностью форматов даты и времени ISO8601 является то, что вы можете просто сравнивать строки в алфавитном порядке.Таким образом, вы можете записать текущее время в NSString в формате ISO8601, а затем использовать метод NSString compare для двух строк.

Однако часто лучше сравнивать NSDate объекты.Я использую две вспомогательные функции для преобразования между строкой даты ISO и NSDate, используя strftime и strptime - эти функции просто выполняют часть yyyy-mm-dd, но вы должны иметь возможность легко их расширять:

NSString* ISOStringWithDate(NSDate* date)
{
    char buf[11];  // Enough space for "yyyy-mm-dd\000"
    time_t clock = [date timeIntervalSince1970];
    struct tm time;
    gmtime_r(&clock, &time);
    strftime_l(buf, sizeof(buf), "%Y-%m-%d", &time, NULL);
    return [NSString stringWithUTF8String:buf];
}

NSDate* dateWithISOString(NSString* dateString)
{
    struct tm time;
    memset(&time, 0, sizeof(time));
    if (!strptime_l([dateString UTF8String], "%Y-%m-%d", &time, NULL))
    {
        return nil;
    }
    time_t clock = timegm(&time);
    return [NSDate dateWithTimeIntervalSince1970:clock];
}
4 голосов
/ 16 декабря 2011

Используйте класс Питера Хоси ISO8601DateFormatter, чтобы разобрать его в объект NSDate, а затем сравнить его с [NSDate date].

Пример:

NSString *iso8601String = ...;
ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *isoDate = [formatter dateFromString:iso8601String];
[formatter release]; //if you're not using ARC

BOOL isBeforeCurrent = [[NSDate date] compare:isoDate] == NSOrderedAscending;
...