ユーザーの現在の時刻と、世界中のさまざまな都市を表示する Windows ストア時計アプリを構築しています。
当初は、Google などのタイムゾーン Web サービスを完全に使用する予定でしたが、無料アカウントで許可されるリクエストの数と、有料アカウントを取得するためのコストを検討した結果、別の方法を見つけたほうがよいと感じました。家を抵当に入れなくても解決。
いろいろと調べてみると、John Skeet とチームによる優れた NodaTime ライブラリが見つかりました。ドキュメントとここでスタックオーバーフローを掘り下げた後、私の頭はまだすべての日時とタイムゾーンに関連する用語と変換方法で賑やかです。とにかく、私は2つのオプションでこれを行うことができると思いました:
オプション 1 : DateTime.Now を使用して現在のシステム時刻を取得し、次のように nodatime を使用して他のゾーンの時刻を取得します (SO に関する別の質問への返信で Matt Johnson によって提供されたコードに基づく):
DateTimeZone homeZone = DateTimeZoneProviders.Tzdb["Asia/Colombo"];
LocalDateTime homeTime = LocalDateTime.FromDateTime(DateTime.Now);
ZonedDateTime homeTimeInZone = homeTime.InZoneStrictly(homeZone);
TbTime1.Text = "Home time is: " + homeTimeInZone.ToDateTimeOffset();
DateTimeZone timeZone1 = DateTimeZoneProviders.Tzdb["Australia/Perth"];
ZonedDateTime timeZone1Time = homeTimeInZone.WithZone(timeZone1);
TbTime2.Text = "Timezone 1 time is: " + timeZone1Time.ToDateTimeOffset();
オプション 2 : さらに調べたところ、この解決策を見つけ、次のようにもうまく機能すると感じました。
public ZonedDateTime GetTimeInTimeZone(string timeZone)
{
// Timezone is olson timezone e.g. "Asia/Colombo"
Instant now = SystemClock.Instance.Now;
var zone = DateTimeZoneProviders.Tzdb[timeZone];
ZonedDateTime zonedDateTime = now.InZone(zone);
return zonedDateTime;
}
ここで質問に答えてみましょう: 上記の両方のオプションでは、DateTime.NowまたはSystemClock.Instance.Nowのいずれかに依存して、最初にユーザーのシステム時刻を識別し、次にそれを必要なタイムゾーンの都市時間に変換します。しかし、ユーザーのシステムが正しい時刻に設定されていない場合はどうなるでしょうか? 私は信じています(間違っている場合は修正してください)DateTime.NowとSystemClock.Instance.Nowは両方ともシステムクロックを使用して現在の時刻を取得していますか? システム時刻が正しく設定されていないと仮定すると、ユーザーのシステム時刻に依存しているため、タイムゾーンを変換すると他の都市の時刻が間違って表示されるだけです。
このような場合、システム クロックに依存せずにユーザーの現在の時刻を確立するにはどうすればよいですか? 緯度/経度を使用してユーザーの現在のタイムゾーンを取得するために Web サービスを使用するように戻す必要がありますか、またはオフラインで作業できる NodaTime などを使用するより良いオプションはありますか? ありがとう。