NSDate
をUIDatePicker
から取得しようとしていますが、それは常に後に20秒の日付時間を返します。 NSDate
を手動で0に設定するにはどうすればよいですか?NSDateの秒数をゼロに設定するには
答えて
NSDateは不変なので、時刻を変更することはできません。
NSTimeInterval time = floor([date timeIntervalSinceReferenceDate]/60.0) * 60.0;
NSDate *minute = [NSDate dateWithTimeIntervalSinceReferenceDate:time];
編集ウリさんのコメントに
に答えるためにNSDate
のための基準日は2001年1月1日、午後12時00分GMTです:しかし、あなたは最も近い分にスナップ新しい日付オブジェクトを作成することができます。それ以来2つの閏秒が追加されています:2005年と2010年のため、[NSDate timeIntervalSinceReferenceDate]
によって返される値は2秒ずれているはずです。
これはそうではありません。timeIntervalSinceReferenceDate
は、壁の時刻に正確に同期しています。
質問に答えるとき、私はこれが実際に本当であることを確認しませんでした。私はちょうどMac OSがbehave as UNIX time(1970エポック)であると仮定しました。POSIXは毎日が86,400秒の倍数で始まることを保証します。
NSDate
から返された値を見ると、この仮定は正しいと思われますが、それについての明確な(文書化された)ステートメントを見つけることは間違いありません。
NSDate
は、1つの瞬間を記録します。特定の日を保存する場合は、NSDate
を使用しないでください。あなたは、タイムゾーン、夏時間e.tc.に関連する予期しない頭痛をたくさん受けるでしょう。
2011年9月15日の20110915のように、曜日をISO準標準形式で整数として格納する方法もあります。これは、NSDate
と同じ方法で並べ替えることが保証されています。
NSTimeIntervalは、基準日からの秒単位の距離であるため、直接操作することはできません.60秒で00秒になることは保証されません。結局、うるう秒はソーラータイムとUTCの差を調整するために挿入されます。各うるう秒は、私が0に私の日付の秒を修正するために何1.によってあなたを投げるだろうです:
NSDate * startDateTime = [NSDate date];
NSDateComponents * startSeconds = [[NSCalendar currentCalendar] components: NSSecondCalendarUnit fromDate: startDateTime];
startDateTime = [NSDate dateWithTimeIntervalSinceReferenceDate: [startDateTime timeIntervalSinceReferenceDate] -[startSeconds second]];
これは、うるう秒の世話をします。私もクリーンな方法は-dateByAddingComponentsを使用することです推測:
NSDate * startDateTime = [NSDate date];
NSDateComponents * startSeconds = [[NSCalendar currentCalendar] components: NSSecondCalendarUnit fromDate: startDateTime];
[startSeconds setSecond: -[startSeconds second]];
startDateTime = [[NSCalendar currentCalendar] dateByAddingComponents: startSeconds toDate: startDateTime options: 0];
あなたは特別なものは何でも物事-dateByAddingComponentsがいることを保証しているその方法:だけでなく計上されたの世話をします。
'timeIntervalSinceReferenceDate'に影響を与えるうるう秒についてのあなたの主張は真実ではないと思います。 Appleの「日付と時刻のプログラミングガイド」では明示的に動作を定義していませんが、POSIXはUNIXの場合にそうしています。うるう秒は無視されます(http://en.wikipedia.org/wiki/Unix_time参照)。これはココアにも当てはまると思われます。 –
もう1つの考え方:提案されている解決方法はどちらも秒数を考慮していません。 (整数)秒数を計算し、元の日付から減算します。結果は、0秒の時間ですが、ゼロ以外のミリ秒です。少し奇数です。 –
これは古い質問ですが、Uliは「正しい」答えを示していますが、最も単純な解決策は、カレンダーから取得した日付から秒を差し引くことです。これはまだミリ秒の場所が残っているかもしれないことを覚えておいてください。ここで
NSDate *date = [NSDate date];
NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSCalendarUnitSecond
fromDate:date];
date = [date dateByAddingTimeInterval:-comp.second];
はスウィフトでこれを行うに拡張したものである:ここでは
extension NSDate {
func truncateSeconds() -> NSDate {
let roundedTime = floor(self.timeIntervalSinceReferenceDate/60) * 60
return NSDate(timeIntervalSinceReferenceDate: roundedTime)
}
}
は興味を持っている人のためスウィフト拡張したものです:
extension Date {
public mutating func floorSeconds() {
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: self)
self = calendar.date(from: components) ?? self // you can handle nil however you choose, probably safe to force unwrap in most cases anyway
}
}
使用例:
let date = Date()
date.floorSeconds()
使用方法DateComponents
は、日付に時間間隔を追加するよりはるかに堅牢です。
- 1. NSDate書式設定
- 2. NSDateを特定の時間に設定する
- 3. scipy.sparse:ゼロを0に設定
- 4. レポートビルダ式にゼロを設定する
- 5. Lua:変数をゼロに設定する方法
- 6. なぜ/変数はゼロに設定されていますか
- 7. setTimeout関数を3秒ごとに設定する方法
- 8. UITextField.textをNSDateに設定するにはどうすればよいですか?
- 9. 日時 - 00秒に設定
- 10. セッション変数の初期値を 'ゼロ'に設定する方法は?
- 11. 整数変数を設定して秒数以内にリセットする方法
- 12. 連続する行数をゼロに設定して行を検索する。 (MySQL)
- 13. 複素数の虚数部をゼロに設定するにはどうすればよいですか?
- 14. Kotlinはゼロに引数にデフォルト値を設定し、コンストラクタを生成
- 15. Cron:代替の秒を設定する
- 16. JavaScriptのカウントダウンタイマーで分秒に先行ゼロを追加する
- 17. Bashの秒数を分と秒に変換するには?
- 18. Laravel - selectRaw count - IF NULLゼロに設定
- 19. mysqlで初期の合計をゼロに設定する
- 20. パーシングカウンターの制限をゼロに設定する
- 21. Railsに同様のカウンターをゼロから設定する
- 22. 行列の対角をゼロに設定するR
- 23. NSDate変数で時間を設定するにはどうすればよいですか?
- 24. MATCH_PARENTに設定すると、幅がゼロになります。
- 25. キューブ内のすべての値を特定の数値以上にゼロに設定する
- 26. ゼロがあるところにsetActiveSelectionを設定する
- 27. 時間、分、秒、およびミリ秒をゼロにするにはどうすればよいですか?
- 28. Unityscript - 5秒かかる動作に5秒の遅延を設定するには
- 29. 変数カウンタをゼロから始めるように設定しますが、
- 30. android 8888ビットマップをすべてゼロに設定する
これは機能しません。基準日からの時間間隔は、00秒の時間に対して60の偶数倍であることが保証されていません。これは基準日からの秒数であり、時折挿入されるうるう秒はあなたを捨てます。あなたはNSCalendarを使ってあなたの日付が何秒あるかを調べ、時間間隔から*を差し引かなければならないと思います。 – uliwitness
現在の分が30秒のマークを超えていると、将来の時間は1分になることがあります。これはラウンドが丸くなる可能性があるために発生します。 'floor([date timeIntervalSinceReferenceDate]/60.0)* 60.0;で試してください。' –
@flovonderuni良いキャッチです。ウォールクロックと同時に「フロア」スイッチの結果が表示されます。編集された答え、ありがとう! –