【问题标题】:NSDate for "beginning of next hour"NSDate 表示“下一小时的开始”
【发布时间】:2011-01-19 13:00:27
【问题描述】:

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

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

【问题讨论】:

    标签: iphone cocoa-touch nsdate


    【解决方案1】:

    使用 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 Date and Time Programming Guide 以供参考。

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

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

    【讨论】:

    • 应该只是 components.hour =1;当我们添加时间时,我们不会替换它们。
    • Swift 代码应该有负分钟数,就像 Obj-C 一样。
    【解决方案2】:

    也许这会有所帮助

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

    }

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不错,下半小时或下十分钟也可以,只需将 3600 更改为下任意几秒。
      【解决方案4】:

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

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

      【讨论】:

      • 请在提交前检查您的代码。 “我觉得……”不好。
      【解决方案5】:

      您可能想检查一下。 Erica Sadun 发布了 NSDate 的一些扩展。

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

      【讨论】:

      • 非常有用的扩展,但对 OP 的问题没有帮助。
      【解决方案6】:

      由于+dateWithNaturalLanguageString 仅在 MacOS SDK 上可用,并且您的目标是 iPhone,您需要创建自己的方法。我觉得NSCalendar class 可以帮到你:

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

      我尚未检查此代码,但它(至少这种方法)必须有效。

      【讨论】:

      • 给出的代码目前可以工作(即使下一小时是午夜),但我认为你应该在技术上使用 NSCalendar 的dateByAddingComponents:toDate: 而不是手动添加组件。不过,NSCalendar 是正确的答案。
      • Yes dateByAddingComponents:toDate 看起来更合适,但您仍然需要以某种方式将分钟和秒组件重置为 0?
      • 什么不完全有效?我刚刚运行了这段代码 - 它对我来说没问题(仍然不知道它是否会在下一小时是午夜的情况下工作)
      • 嗨弗拉基米尔..我已经在我原来的问题中添加了一些细节。谢谢!
      • 用调用 nextHourDate 替换 dateWithNaturalLanguageString 调用?
      猜你喜欢
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2019-08-10
      相关资源
      最近更新 更多