6

我想倒计时到下一个整小时。倒计时到特定时间非常容易,例如:

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];
}  
4

6 回答 6

17

由于+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];
}

我没有检查过这段代码,但它(至少这种方法)必须有效。

于 2010-02-22T07:34:17.357 回答
6

可能是操作时间戳的最简单方法,将其四舍五入到当前小时的开头并添加 1 小时

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

    return [NSDate dateWithTimeIntervalSince1970:next];
}
于 2013-11-02T23:18:48.897 回答
6

使用 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];
于 2014-08-26T08:19:20.970 回答
3

你可能想看看这个。Erica Sadun 发布了 NSDate 的一些扩展。

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

于 2010-02-23T02:01:32.550 回答
1

我认为这会起作用(注意:非常简短的测试)

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];
于 2012-09-07T11:31:51.297 回答
0

也许这会有所帮助

@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;

}

于 2015-02-13T14:23:49.883 回答