【问题标题】:NSDate zero out seconds without rounding upNSDate 将秒数归零而不四舍五入
【发布时间】:2011-07-16 20:15:31
【问题描述】:

我想知道是否有人可以帮助我使用我的方法。我有以下方法,它将 NSDate 对象的秒值清零:

- (NSDate *)dateWithZeroSeconds:(NSDate *)date {
    NSTimeInterval time = round([date timeIntervalSinceReferenceDate] / 60.0) * 60.0;
    return  [NSDate dateWithTimeIntervalSinceReferenceDate:time];
}

问题是当传递一个日期时,例如:

2011-03-16 18:21:43 +0000

它返回:

2011-03-16 18:22:00 +0000

我不希望发生这种舍入,因为实际指定日期的是用户,所以它需要精确到他们要求的那一刻。

非常感谢任何帮助。

【问题讨论】:

    标签: objective-c ios4 nsdate


    【解决方案1】:

    使用 NSCalendar 和 NSDateComponents 获取日期的各个部分。将秒组件设置为 0,然后从该 NSDateComponents 创建一个新日期。

    【讨论】:

    • 当我们仍然必须最终搜索代码来做到这一点时,这并不是很有帮助。
    • @WilliamT。答案不需要提供代码 sn-ps 供您剪切和粘贴以提供帮助。知道正确的方法后,称职的 Objective-C 程序员会编写必要的代码而不是搜索它。
    【解决方案2】:

    使用地板而不是圆形:

    - (NSDate *)dateWithZeroSeconds:(NSDate *)date
    {
        NSTimeInterval time = floor([date timeIntervalSinceReferenceDate] / 60.0) * 60.0;
        return  [NSDate dateWithTimeIntervalSinceReferenceDate:time];
    }
    

    【讨论】:

    • +1 这可能比使用 NSDateComponents 少。如果您想将分钟或小时而不是秒归零,这将不起作用,但在这里应该没问题,因为秒是 NSDate 的基本单位。
    • @DarcyRayner:Cocoa 的 API 是基于 NTP 的,所以无论如何内置 API 都没有考虑闰秒。
    【解决方案3】:

    为了完整起见,这里是使用 NSCalendar 和 NSDateComponents 引用 iOS SDK 8.1 的代码。

    + (NSDate *)truncateSecondsForDate:(NSDate *)fromDate;
    {
         NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
         NSCalendarUnit unitFlags = NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
         NSDateComponents *fromDateComponents = [gregorian components:unitFlags fromDate:fromDate ];
         return [gregorian dateFromComponents:fromDateComponents];
    }
    

    请注意,从 iOS 8 开始,日历单元名称已更改。

    【讨论】:

    • 谢谢这对我有帮助!
    【解决方案4】:

    Swift 2.2 版本的@Neil 答案:

    func truncateSecondsForDate(fromDate: NSDate) -> NSDate {
    
        let calendar : NSCalendar = NSCalendar.currentCalendar()
        let unitFlags : NSCalendarUnit = [.Era , .Year , .Month , .Day , .Hour , .Minute]
        let fromDateComponents: NSDateComponents = calendar.components(unitFlags, fromDate: fromDate)
    
        return calendar.dateFromComponents(fromDateComponents)!
    
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用rangeOfUnit:startDate:interval:forDate: 获取任何时间单位的开始(例如一分钟)

      NSDate *startOfMinuteDate;
      [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitMinute
                                      startDate:&startOfMinuteDate 
                                       interval:NULL 
                                        forDate:originalDate];
      

      【讨论】:

        【解决方案6】:

        Swift 4 版本:

        func truncateSecondsForDate(fromDate: Date) -> Date {
        
            let calendar = Calendar.current
            let fromDateComponents: DateComponents = calendar.dateComponents([.era , .year , .month , .day , .hour , .minute], from: fromDate as Date) as DateComponents
        
            return calendar.date(from: fromDateComponents as DateComponents)! as Date
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-26
          • 1970-01-01
          • 2021-12-16
          • 2017-09-02
          • 2011-12-27
          • 1970-01-01
          • 2013-12-20
          相关资源
          最近更新 更多