2011-09-21 4 views
14

時間モードでUIDatePickerを15分間隔で取得しました。15m間隔のUIDatePickerですが、常に正確な時刻を戻り値として返します

午後7時22分だとしましょう。デフォルトで日付ピッカーが表示する値は、次のより高い/より低い値に切り上げられた現在の時刻です。この場合、午後7時15分です。ユーザーが日付ピッカーと対話する場合、表示される値も返されます。しかし、ユーザーとのやりとりがなく、[UIDatePicker date]で時刻を取得した場合、戻り値は現在の正確な時刻(例:7:22)になります。ユーザーが明示的に値を選択していなくても、現在の丸められていない時間ではなく、日付ピッカーに実際に表示される値を常に得る方法はありますか?私は既にピッカーを[UIDatePicker setDate:[NSDate date]]で手動で設定しようとしましたが、動作は変わりません。

ヒント前もって感謝します!

+0

の可能性の重複:http://stackoverflow.com/questions/6948297/uidatepicker-odd-behavior-when-setting-minuteinterval – mja

+2

問題は、日付ピッカーに保存された日付が一致していないということですピッカー値がユーザーによって変更されるまで表示されます。これにより、事前間隔クランプされた日付がピッカーに入力されなければ、ユーザーが明示的に表示された値を変更しないと結果がクランプされません。その結果、出力値は、ユーザーが見ているものではないため、ユーザーが期待するものではありません。私はなぜそれが自動調整されないのか理解することができます(シンプルで、いくつかのケースではユーザからマスクされたくないかもしれない秒のような他の時間成分を保存しています)。 – ima747

+0

@ ima747ご清聴ありがとうございます! – TigreFurry

答えて

11

これは完璧な解決策ではありませんが、私のために働きます。私は別の投稿からそれを取り出し、異なる値を受け入れるように変更しました。

- (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から取られた)分の値を送り、それはあなたがピッカーに送り込むことができる間隔にクランプされた時間を返します。

6

Swift 3/4とUIDatePickerの拡張子として@ ima747の回答が変更されました。 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) 
    } 
}