4

ユーザーにとって絶対時間よりも相対時間が重要な状況があります。そのため、「CDT の午後 1 時にイベントが発生し、現在は 5 日後の CST の午後 5 時です」というよりも、「イベントが 5 日と 5 時間前に発生した」とすばやく言えることが重要です。

日付を UTC で保存し、変換してユーザーに表示します。

pDateTime = DateTime.SpecifyKind(pDateTime, DateTimeKind.Utc);
DateTimeZone dateTimeZone = DateTimeZoneProviders.Tzdb[pCurrentUser.PreferredTimezone];
return Instant.FromDateTimeUtc(pDateTime).InZone(dateTimeZone).ToString("HH':'mm':'ss' 'MM'/'dd'/'yy' 'x", CultureInfo.InvariantCulture);

NodaTime 1.2 が完全にリリースされた時点で使用し、以前はバニラの ToString を使用していました。

ただし、このパターンを使用する時間は、現在の夏時間の状況ではなく、その時間の夏時間の状況を使用することになります。16:15:32 10/25/13 CDTこれは、 CST に移行したにもかかわらず、時間が次のように見えることを意味します。

これは時間の絶対的な尺度です。これにより、ユーザーは次の論理を実行する必要があります。「それはどれくらい前のことですか?今は夏時間ですか?そうであれば、差は x です。そうでない場合は、1 時間を足すか引くかしなければなりませんか?それが差 y になります。」

一方、15:15:32 10/25/13 CSTDST がない場合は、時間の相対的な尺度が表示されます。これにより、ユーザーは変換を行う必要がなくなり、コンテキスト内でその時間が何を意味するかをはるかに簡単に計算できるようになります。

多数の日付があるディスプレイでは、セット全体で絶対時間ロジックを実行するのが難しい場合があります。一度やるとうまくいくのは難しいです。ただし、「posted 5 hours ago」のような親しみやすい相対文字列は、日付と時刻の両方を自分で解決することも強制します。その情報は依然として重要です。

妥協案として、最初の 24 時間は投稿された空白の時間/分前に行うか、わかりやすい文字列と絶対時間の両方を含めることが考えられます。これらは両方とも、私が見たパターンです。

しかし、それらを無視して、相対コンテキストで表示される時間を取得するために、NodaTime に特定の昼光ステータスを時間に吹き込む方法はありますか?

4

1 に答える 1

4

ただし、このパターンを使用する時間は、現在の夏時間の状況ではなく、その時間の夏時間の状況を使用することになります。これは、CST に移行したにもかかわらず、16:15:32 10/25/13 CDT のように見えることを意味します。

はい、そうすべきです。CDT で日付/時刻が発生しているにもかかわらず、CST で日付/時刻を表示するのは非常に奇妙です。

そのため、「CDT の午後 1 時にイベントが発生し、現在は 5 日後の CST の午後 5 時です」というよりも、「イベントが 5 日と 5 時間前に発生した」とすばやく言えることが重要です。

その場合、私の見解では、日付/時刻をまったく表示すべきではありません。ZonedDateTime両方の値をに変換し、それらInstantの間を取るDurationと、5 日と 5 時間前であることがわかります。(これに関してどれだけの支援が提供されたか思い出せません - 手動でティック数を取得して割る必要があるかもしれません。しかし、それが役立つかどうかを確認するために見てください。NodaConstants.TicksPerStandardDay)DurationPattern

または、本当に日付と時刻を表示したいが、それらの違いを頭の中で簡単に抽出できる場合は、次の 2 つのオプションが提案されます。

  • OffsetDateTime代わりに使用してください。そこで、オフセットを強制的に同じにすることができますが、時間を観察していたゾーンの実際の現在のオフセットではないオフセットを表示するのは奇妙だと思います。または、関連するオフセットを単に表示することもできますつまり、CST の場合は -5、CDT の場合は -4 です。
  • 夏時間の移行が無関係になるように、すべてを UTC で表示するだけです。

カレンダー論理演算 (期間) ではなく、経過時間 (期間) を扱っているため、2 つの値の間で月を取得できないことに注意してください。ZonedDateTime

于 2013-11-06T15:53:31.903 に答える