NSDateComponents ошибочно добавляет один дополнительный час - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать метод в Objective-C, который бы получал общее количество минут из значения времени, записанного в формате «ЧЧмм».

Например, для "0210" возвращаемое значение должно быть 130.

+ (int)totalMinutesFromHHmm:(NSString *)HHmm {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"HHmm"];
    NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-GB"];
    [dateFormatter setLocale:enLocale];

    NSDate *date = [dateFormatter dateFromString:HHmm];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *components = [calendar components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:date];
    NSInteger hour = [components hour];
    NSInteger minute = [components minute];
    return (int)(hour * 60 + minute);
}

Проблема в компоненте часа: он всегда отключен на один час.

enter image description here

На этом снимке NSDate показывает время 09:22, но на рисунке ниже вы можете видеть, что часовой компонент равен 10 (для минутного компонента правильно установлено значение 22).

enter image description here

Я просматривал другие посты («NSDateComponents on hour off» и т. Д.), Но не смог найти решение, которое работает.Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 14 декабря 2018

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

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

+ (int)totalMinutesFromHHmm:(NSString*)HHmm
{
    NSString* refHHmm = @"0000";

    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HHmm"];

    NSDate* refDate = [dateFormatter dateFromString:refHHmm];
    NSDate* date = [dateFormatter dateFromString:HHmm];

    int minutes = [date timeIntervalSinceDate:refDate] / 60;

    return minutes;
}

В противном случае это может быть более простой вариант, поскольку вы знаете, что у вас будет 4-символьная строка, представляющая часы и минуты:

+ (int)totalMinutesFromHHmm:(NSString*)HHmm
{
    int minutes = [[HHmm substringWithRange:NSMakeRange(0, 2)] intValue] * 60;
    minutes += [[HHmm substringWithRange:NSMakeRange(2, 2)] intValue];

    return minutes;
}
...