NSDate для "начала следующего часа"
Я хочу сделать обратный отсчет до следующего полного часа. Это довольно легко для обратного отсчета до определенного времени, например:
NSDate *midnight = [NSDate dateWithNaturalLanguageString:@"midnight tomorrow"];
как определить NSDate для "начала каждого часа"?
Спасибо!
EDIT: Это то, что у меня есть в настоящее время. Не удалось интегрировать решения в мой код. Любая помощь будет принята с благодарностью.:)
-(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];
}
Ответы
Ответ 1
Поскольку +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 the last hour of the day
return [calendar dateFromComponents:comps];
}
Я не проверял этот код, но он (по крайней мере, такой подход) должен работать.
Ответ 2
Самый простой способ - манипулировать меткой времени, округлить ее до начала текущего часа и добавить 1 час
- (NSDate*)nextHourDateForDate:(NSDate*)date {
NSTimeInterval timestamp = [date timeIntervalSince1970];
NSTimeInterval current = timestamp - fmod(timestamp, 3600);
NSTimeInterval next = current + 3600;
return [NSDate dateWithTimeIntervalSince1970:next];
}
Ответ 3
Вы можете проверить это. Эрика Садун опубликовала некоторые расширения для NSDate.
http://github.com/erica/NSDate-Extensions
Ответ 4
Используя 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];
Ответ 5
Я думаю, что это сработает (обратите внимание: очень кратко протестировано)
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];
Ответ 6
Возможно, это может быть полезно
@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;
}