UIDatePicker,间隔为15米,但始终为返回值

时间:2011-09-21 17:32:29

标签: objective-c ios xcode uidatepicker

我在时间模式下有一个UIDatePicker,间隔为15分钟。

我们说是晚上7:22。日期选择器默认显示的值是四舍五入到下一个更高/更低值的当前时间,在这种情况下,它是下午7:15。如果用户与日期选择器交互,则显示的值也是返回的值。但是,如果没有任何用户交互并且我得到[UIDatePicker date]的时间,则返回值是确切的当前时间,即坚持示例的7:22。有没有办法总是获得实际显示在日期选择器上的值而不是当前的未连接时间,即使用户没有明确选择值?我已经尝试使用[UIDatePicker setDate:[NSDate date]]手动设置选择器,但这不会改变行为。

任何提示?提前谢谢!

3 个答案:

答案 0 :(得分:17)

我修改了@ ima747对Swift 3/4的回答以及UIDatePicker的扩展名。 picker.clampedDate

extension UIDatePicker {
    /// Returns the date that reflects the displayed date clamped to the `minuteInterval` of the picker.
    /// - note: Adapted from [ima747's](http://stackoverflow.com/users/463183/ima747) answer on [Stack Overflow](http://stackoverflow.com/questions/7504060/uidatepicker-with-15m-interval-but-always-exact-time-as-return-value/42263214#42263214})
    public var clampedDate: Date {
        let referenceTimeInterval = self.date.timeIntervalSinceReferenceDate
        let remainingSeconds = referenceTimeInterval.truncatingRemainder(dividingBy: TimeInterval(minuteInterval*60))
        let timeRoundedToInterval = referenceTimeInterval - remainingSeconds
        return Date(timeIntervalSinceReferenceDate: timeRoundedToInterval)
    }
}

答案 1 :(得分:12)

这不是一个完美的解决方案,但它对我有用。我从另一篇文章中获取并修改它以接受不同的值。

- (NSDate*)clampDate:(NSDate *)dt toMinutes:(int)minutes {
int referenceTimeInterval = (int)[dt timeIntervalSinceReferenceDate];
int remainingSeconds = referenceTimeInterval % (minutes*60);
int timeRoundedTo5Minutes = referenceTimeInterval - remainingSeconds; 
if(remainingSeconds>((minutes*60)/2)) {/// round up
    timeRoundedTo5Minutes = referenceTimeInterval +((minutes*60)-remainingSeconds);            
}
 return [NSDate dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)timeRoundedTo5Minutes];
}

输入一个输入日期和分钟值(在此线程的情况下取自UIDatePicker.minuteInterval),它将返回一个时间限制到该间隔,您可以将其提供给选择器。

答案 2 :(得分:0)

@ ima747是正确的,如果我更改了日期选择器的默认值,那么它工作正常,如果我在没有 onChange 然后它返回了错误的日期值。
但是我已经检查过,日期选择器控件设置了默认日期(当前日期,可能是它使用最近的时间毫秒)如果我将它设置为自定义日期并且还将时间设置为任何日期和1:00 :AM所以现在我的时间选择器始终以1:00:AM而不是当前时间打开 enter image description here