NSDate для «начала следующего часа» - PullRequest
3 голосов
/ 22 февраля 2010

Я хотел бы сделать обратный отсчет до следующего полного часа. Отсчет времени до определенного времени довольно прост, например:

NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; 

как мне определить NSDate для "начала каждого часа"?

Спасибо!

РЕДАКТИРОВАТЬ: Это то, что у меня есть в настоящее время. Возникли проблемы при интеграции решений в мой код. Любая помощь будет принята с благодарностью. :)

-(void)updateLabel {
NSDate *now = [NSDate date];

NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"]; 

//num of seconds between mid and now
NSTimeInterval timeInt = [midnight timeIntervalSinceDate:now];
int hour = (int) timeInt/3600;
int min = ((int) timeInt % 3600) / 60;
int sec = (int) timeInt % 60;
countdownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min,sec];
}  

Ответы [ 6 ]

16 голосов
/ 22 февраля 2010

Поскольку +dateWithNaturalLanguageString доступно только в MacOS SDK, и вы ориентируетесь на iPhone, вам нужно будет создать собственный метод. Я думаю, NSCalendar класс может помочь вам:

- (NSDate*) nextHourDate:(NSDate*)inDate{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comps = [calendar components: NSEraCalendarUnit|NSYearCalendarUnit| NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit fromDate: inDate];
    [comps setHour: [comps hour]+1]; // Here you may also need to check if it's the last hour of the day
    return [calendar dateFromComponents:comps];
}

Я не проверял этот код, но он (по крайней мере, этот подход) должен работать.

5 голосов
/ 03 ноября 2013

Самый простой способ, вероятно, манипулировать отметкой времени, округлить ее до начала текущего часа и добавить 1 час

- (NSDate*)nextHourDateForDate:(NSDate*)date {
    NSTimeInterval timestamp = [date timeIntervalSince1970];
    NSTimeInterval current = timestamp - fmod(timestamp, 3600);
    NSTimeInterval next = current + 3600;

    return [NSDate dateWithTimeIntervalSince1970:next];
}
3 голосов
/ 23 февраля 2010

Вы можете проверить это. Эрика Садун опубликовала некоторые расширения NSDate.

http://github.com/erica/NSDate-Extensions

2 голосов
/ 26 августа 2014

Используя DateComponents и Date, вы получите его, добавив отрицательное количество минут и одного часа к указанной дате.

Swift3 (как расширение):

extension Date {
    public var nextHour: Date {
        let calendar = Calendar.current
        let minutes = calendar.component(.minute, from: self)
        let components = DateComponents(hour: 1, minute: -minutes)
        return calendar.date(byAdding: components, to: self) ?? self
    }
}

Используйте с let nextHourDate = myDate.nextHour

См. Apple Руководство по программированию даты и времени для справки.

=============================================== ============================

ObjectiveC (как статический метод):

+ (NSDate *)nextHourDate:(NSDate *)date{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:NSMinuteCalendarUnit|NSHourCalendarUnit fromDate:date];
    components.minute = -components.minute;
    components.hour = 1;
    return [calendar dateByAddingComponents:components toDate:date options:0];
}

И назовите это с помощью:

[YourClass nextHourDate:yourDate];
1 голос
/ 07 сентября 2012

Я думаю, что это сработает (примечание: очень кратко протестировано)

NSDateFormatter *currentSecondFormatter = [[NSDateFormatter alloc] init];
[currentSecondFormatter setDateFormat:@"ss"];
NSDateFormatter *currentMinuteFormatter = [[NSDateFormatter alloc] init];
[currentMinuteFormatter setDateFormat:@"mm"];

// get next hour from now
int timeUntilNextHour = ( (60 - [[currentMinuteFormatter stringFromDate:[NSDate date]] integerValue]) * 60) -  [[currentSecondFormatter stringFromDate:[NSDate date]] integerValue];
0 голосов
/ 13 февраля 2015

Может быть, это может быть полезно

@implementation NSDate (DB_Extension)

- (NSTimeInterval) db_secondsForNextHour {

NSDateFormatter *minutesFormatter = [[NSDateFormatter alloc] init];
[minutesFormatter setDateFormat:@"mm"];

NSDateFormatter *secondsFormatter = [[NSDateFormatter alloc] init];
[secondsFormatter setDateFormat:@"ss.SSS"];

NSTimeInterval secondsForNextHour = (60.0 - [[minutesFormatter stringFromDate:self] doubleValue])*60 - [[secondsFormatter stringFromDate:self] doubleValue];

return secondsForNextHour;

}

...