Определить, если текущее местное время между двумя разами (игнорируя часть даты) - PullRequest
4 голосов
/ 21 января 2010

Учитывая, что в Cocoa-Touch нет NSTime (Objective-C на iPhone) и задано два раза как NSStrings и часовой пояс как NSString, как вы можете рассчитать, находится ли текущее ЛОКАЛЬНОЕ время между этими двумя временами , Помните, что дата в строках времени НЕ имеет значения и заполнена фиктивными датами.

Например:

 TimeZone: Pacific Time (US & Canada)
 Start Time: 2000-01-01T10:00:00Z
 End Time: 2000-01-01T17:00:00Z

 Local Time: now

Как вы подтверждаете, находится ли местное время между указанным диапазоном времени (гарантируя сначала преобразование времени начала / окончания в надлежащий часовой пояс)?

Ответы [ 3 ]

5 голосов
/ 22 января 2010

Самая большая проблема в этом заключается в том, что время может длиться два дня (первоначально они могли бы и не быть, но когда вы выполняете преобразование часового пояса, после этого они могут). Поэтому, если мы хотим полностью игнорировать данную информацию о дате, необходимо сделать некоторые предположения о том, как обрабатывать эти интервалы дат. Ваш вопрос не точный о том, как с этим справиться (т.е. я не знаю точно, чего бы вы хотели достичь), так что вот только один способ сделать это, который может быть не совсем тем, что вам нужно, но надеюсь, это поможет вам в правильном направлении:

  • Разобрать данные строки для NSDate объектов, игнорируя информацию о дате (результат: время обрабатывается так, что предполагается, что оно относится к одному и тому же дню) и выполняет преобразование часового пояса
  • Получить интервал времени от более раннего NSDate до более позднего NSDate
  • Создание NSDate объектов для "сегодня в ранее заданное время" и "вчера в ранее заданное время"
  • Сравните интервалы времени от этих двух NSDate с до текущей даты / времени с интервалом времени между двумя данными датами / временем

Также обратите внимание, что строки часового пояса в заданном вами формате ("Pacific Time (US & Canada)") не будут поняты NSTimeZone, поэтому вам нужно будет выполнить какое-то преобразование там.

Вот пример кода (я написал это для OS X, поскольку у меня нет iPhone SDK, поэтому, надеюсь, все используемые API будут также доступны на iPhone) :

- (BOOL)checkTimes
{
    // won't work:
    //NSString *tzs = @"Pacific Time (US & Canada)";
    // 
    // will work (need to translate given timezone information
    // to abbreviations accepted by NSTimeZone -- won't cover
    // that here):
    NSString *tzs = @"PST";

    NSString *ds1 = @"2000-01-01T10:00:00Z";
    NSString *ds2 = @"2000-01-01T17:00:00Z";

    // remove dates from given strings (requirement was to ignore
    // the dates completely)
    ds1 = [ds1 substringFromIndex:11];
    ds2 = [ds2 substringFromIndex:11];

    // remove the UTC time zone designator from the end (don't know
    // what it's doing there since the time zone is given as a
    // separate field but I'll assume for the sake of this example
    // that the time zone designator for the given dates will
    // always be 'Z' and we'll always ignore it)
    ds1 = [ds1 substringToIndex:8];
    ds2 = [ds2 substringToIndex:8];

    // parse given dates into NSDate objects
    NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease];
    [df setDateFormat:@"HH:mm:ss"];
    [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:tzs]];
    NSDate *date1 = [df dateFromString:ds1];
    NSDate *date2 = [df dateFromString:ds2];

    // get time interval from earlier to later given date
    NSDate *earlierDate = date1;
    NSTimeInterval ti = [date2 timeIntervalSinceDate:date1];
    if (ti < 0)
    {
        earlierDate = date2;
        ti = [date1 timeIntervalSinceDate:date2];
    }

    // get current date/time
    NSDate *now = [NSDate date];

    // create an NSDate for today at the earlier given time
    NSDateComponents *todayDateComps = [[NSCalendar currentCalendar]
                                        components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
                                        fromDate:now];
    NSDateComponents *earlierTimeComps = [[NSCalendar currentCalendar]
                                          components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit
                                          fromDate:earlierDate];
    NSDateComponents *todayEarlierTimeComps = [[[NSDateComponents alloc] init] autorelease];
    [todayEarlierTimeComps setYear:[todayDateComps year]];
    [todayEarlierTimeComps setMonth:[todayDateComps month]];
    [todayEarlierTimeComps setDay:[todayDateComps day]];
    [todayEarlierTimeComps setHour:[earlierTimeComps hour]];
    [todayEarlierTimeComps setMinute:[earlierTimeComps minute]];
    [todayEarlierTimeComps setSecond:[earlierTimeComps second]];
    NSDate *todayEarlierTime = [[NSCalendar currentCalendar]
                                dateFromComponents:todayEarlierTimeComps];

    // create an NSDate for yesterday at the earlier given time
    NSDateComponents *minusOneDayComps = [[[NSDateComponents alloc] init] autorelease];
    [minusOneDayComps setDay:-1];
    NSDate *yesterday = [[NSCalendar currentCalendar]
                         dateByAddingComponents:minusOneDayComps
                         toDate:now
                         options:0];
    NSDateComponents *yesterdayDateComps = [[NSCalendar currentCalendar]
                                            components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
                                            fromDate:yesterday];
    NSDateComponents *yesterdayEarlierTimeComps = [[[NSDateComponents alloc] init] autorelease];
    [yesterdayEarlierTimeComps setYear:[yesterdayDateComps year]];
    [yesterdayEarlierTimeComps setMonth:[yesterdayDateComps month]];
    [yesterdayEarlierTimeComps setDay:[yesterdayDateComps day]];
    [yesterdayEarlierTimeComps setHour:[earlierTimeComps hour]];
    [yesterdayEarlierTimeComps setMinute:[earlierTimeComps minute]];
    [yesterdayEarlierTimeComps setSecond:[earlierTimeComps second]];
    NSDate *yesterdayEarlierTime = [[NSCalendar currentCalendar]
                                dateFromComponents:yesterdayEarlierTimeComps];

    // check time interval from [today at the earlier given time] to [now]
    NSTimeInterval ti_todayEarlierTimeTillNow = [now timeIntervalSinceDate:todayEarlierTime];
    if (0 <= ti_todayEarlierTimeTillNow && ti_todayEarlierTimeTillNow <= ti)
        return YES;

    // check time interval from [yesterday at the earlier given time] to [now]
    NSTimeInterval ti_yesterdayEarlierTimeTillNow = [now timeIntervalSinceDate:yesterdayEarlierTime];
    if (0 <= ti_yesterdayEarlierTimeTillNow && ti_yesterdayEarlierTimeTillNow <= ti)
        return YES;

    return NO;
}
0 голосов
/ 22 января 2010

Вы должны иметь возможность делать то, что вы хотите сделать, с комбинацией NSDate и NSDateFormatter.

NSDateFormatter имеет метод dateFromString:, который позволит вам преобразовать ваши строки в NSDate объекты, затем вы можете использовать метод compare: NSDate, чтобы сравнить их с [NSDate date], которые текущее время.

(NSDate охватывает как дату, так и время)

0 голосов
/ 21 января 2010

Вам, вероятно, стоит взглянуть на NSCalendar и NSDateComponents. Я использую их для подсчета даты в приложении для iPhone. Я не вижу встроенного метода, который бы делал то, что вы хотите напрямую, но вы можете понять это, разбив его на части, которые я ожидаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...