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