0

「2011-03-29T15:57:02.680-04:00」などの時刻が現在時刻より前かどうかを確認したい。どうすればこれを行うことができますか?

4

2 に答える 2

4

Peter Hoseyの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;
于 2011-12-16T18:41:04.437 に答える
4

ISO8601の日付と時刻の形式の優れている点は、文字列をアルファベット順に簡単に比較できることです。したがって、現在の時刻をISO8601形式でNSStringに書き込んでからcompare、2つの文字列に対してNSStringのメソッドを使用できます。

NSDateただし、多くの場合、オブジェクトを比較する方が適切です。strftime2つのヘルパー関数を使用してISO日付文字列とNSDateを変換します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];
}
于 2011-12-16T19:50:26.747 に答える