1

私は現在、学校のスケジュールを処理するスケジューリングアプリケーションを作成しています。各スケジュールには、開始時刻と終了時刻の両方を含む期間オブジェクトの配列があります。現在、これらの時刻はNSDateオブジェクトとして保存されています。ここでは、時刻のみが実際に関連しており、各NSDateオブジェクトには、アプリケーションにとってほとんど重要ではない任意の日付が関連付けられています(UIDatePickerが割り当てたものは何でもですが、TimePickerModeのみを使用します) )。私はこれらの日付で多くのことをします。まず、NSDateFormatterを使用して、UITableViewの各期間の時間の文字列表現を出力します。次に、[NSDate date]によって取得された現在の時刻を開始時刻と終了時刻と比較することにより、その日の現在の期間を見つけようとします。しかし、私はこれを行うための最良の方法を決定するのに苦労しています。

現在、NSDateFormatterを使用して開始時刻と終了時刻を文字列に変換してから、今日の日付と同じ日付の日付に戻しています。その後、-(NSComparisonResult)compareを使用して日付の比較を行うことができます。開始日と終了日を現在の日付と比較します。しかし、これは非常に非効率的であると私は見ることができました。

他の可能な方法は、各NSDateをNSDateComponentsに変換してから、NSCalendarを使用して、現在の日付と同じ元の時刻を持つNSDateに変換し直すことです。

または、別のアプローチを取り、NSDateストレージ手法を完全に廃止することもできます。代わりに、各開始時刻と終了時刻をNSDateComponentsとして保存できます。その後、UITableViewの時刻のフォーマットされたバージョンを出力するのに十分簡単で、[NSDate date]によって取得された日付をNSDateComponentsに変換して、論理に使用できます。現在の期間を取得するための比較。

これについては3つまたは4つの異なる方法がありますが、実際に話し合った後、さまざまなタイプの日付オブジェクト間で実行時の変換が最小限で済むため、最後に説明した方法が最も効率的であると確信しています。私は他の人の意見を探しています。

4

2 に答える 2

1

NSDateを使用して時刻を格納する場合の問題は、その値がタイムゾーンに依存することです。アプリがフォアグラウンドまたはバックグラウンドで実行されているときにタイムゾーンまたはDSTが変更されると、すべての時間が突然間違ってしまいます。NSDate値を実際にディスクに保存する場合も同様です。(1つのオプションは、アプリのデフォルトのタイムゾーンをUTCに設定することですが、そうすると、アプリの「今」の概念はユーザーにとって正しくなくなります)。

時間を個別に保存し、NSDateとの間で変換するメソッドを実装します。NSDateComponentsを使用して時間を保存することも、単一の整数(たとえば、深夜0時過ぎの分)として保存することもできます。これにより、2回の比較が簡単になります。

NSDateとの間で議事録を変換する場合はNSDateComponentsを使用し、UIDatePickers、NSCalendars、およびNSDateFormattersが同じタイムゾーン(デフォルトではローカルタイムゾーン)を使用していることを確認する必要があります。

于 2011-02-28T05:13:34.410 に答える
0

生理の日と現在の日付を同期するために NSDateFormatter が現在プログラムに課しているオーバーヘッドについて心配しているようです。しかし、実際には、日付はまったく気にしません。その日の始まりからの時間が必要なだけです。

仲買人を切り捨ててみませんか?開始時刻と終了時刻を NSTimeIntervals として保存します。これは実際には単なる double です。開始時刻と終了時刻を 1 日の秒数である 86,400 で修正して、新しい日の開始後の秒単位の時刻に単純化します。その日が 0 秒として表されることを除いて、それが何日を表しているかはあまり気にしません。

次に、現在の NSDate をプルするたびに、その NSTimeInterval を 86,400 で変更して時間を秒単位で取得し、保存されている期間値と比較します。プロセス全体に含まれる唯一のオブジェクト変換は、プリミティブ timeIntervalSinceReferenceDate を使用することです。残りは単純な mod および比較演算子であり、期間番号を単純な NSTimeIntervals として保存できます。

于 2011-02-28T04:29:16.500 に答える