2016-05-11 17 views
1

私は、世界各地に展開される可能性のあるいくつかのデータ収集ポイントからデータを受け取るアプリケーションを持っています。それらはAzureサービスバスのキューにポストし、コンソールアプリケーションはキューから読み取り、UTCタイムスタンプとそれが来た場所を表すIDでこのデータを格納します。UTCを現地時間に変換する - データキャプチャの現地時間を保存/推測する方法

私は20秒ごとにリフレッシュ、入力されたデータに基づいて、反動的なイベントを実行するサービスを持っている、そしてそれはのデータウィンドウになります。

var window = DateTime.UtcNow.AddSeconds(-20); 

var events = context.MyTable.Where(x => x.Timestamp >= window).ToList(); 

//Process the events 

時間はUTCに標準化されているように、これは正常に動作します。

私もしかし、たとえば、アカウント夏時間(DST)を考慮して、同様に現地時間に、このデータに対して約統計を主張できるようにする必要があり

:1日の

「平均時間というこのタイプのイベントは09:30:00です。

この例では、09:30:00は、PST、GMTなどで発生したかどうかにかかわらず、DSTを考慮して現地時間を意味します。

私はイベントが、このデータはから来ている場所を表すオブジェクトに関連する場所同上、で保存されます言ったように:彼らはドンすなわち、一度これらの場所を設定

public class Location 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public Organisation organisation { get; set; } 
} 

」は永久的なもの異なるタイムゾーンに移動することはできますが、DSTによってローカル時間が変わることがあります。

UTCの標準化されたイベントが発生した現地時間を推測するためにLocationオブジェクトに追加する必要があるフィールド(およびそのフォーマット)と、UTCの変換に使用する方法イベントの現地時間。

現地時間午後12時に発生したスペイン(+1)、GMT(+0)、PST(-8)の3つのイベントがある場合彼らは基本的に午後1時、午後12時、午後4時として保存されます。平均は午前9時だったと主張する必要があります。

答えて

-1

UTC時刻として収集している日付を保存してから、DateTime.ToLocalTime()を使って表示する必要があるときにローカル時刻に変更できるはずです。

+0

しかし、ここでの知識がしますタイムゾーンは?例えば現地時間午後12時に発生したスペイン(+1)、GMT(+0)、PST(-8)の3つのイベントがあるとします。基本的に午後1時、午後12時、午後4時に保存されます。平均は午前9時だったと主張する必要があります。 – JonnyKnottsvill

+0

なぜ気になりますか?私は深刻です - UTCに格納するという考え方は、タイムゾーンを処理する必要はありません。あなたはそれが記録されたタイムゾーンを必要とする特別なユースケースは何ですか?関連するタイムゾーンが必要な場合は、時間外に格納します(デバイスエントリの場所など)。データ構造に依存します。 – TomTom

+0

私は、あなたが平均を得たいと思っている場所には本当に従っていません。現地時間の平均が欲しいですか?または、中央UTC時間の平均?それが後者なら、私の提案されたアプローチがうまくいくはずです。また、Eventオブジェクトを変更できますか?それともそれは問題を引き起こすか? –

2

Locationレコードに、TimeZoneという文字列値を追加する必要があります。タイムゾーンID(WindowsタイムゾーンIDまたはIANAタイムゾーンIDのいずれか)を設定する必要があります。相違点の説明については、the timezone tag wikiを参照してください。そのタイムゾーンを使用して、対応するUTC時間に適用される現地時間を決定します。

IANAのタイムゾーンは、Windowsと.NETにロックダウンするのではなく、プラットフォームや言語で使用できるため、使用することをお勧めします。タイムゾーンの事実上の標準です。 .NETでそれらを使用するには、Noda Timeライブラリを使用します。

using NodaTime; 
... 
DateTimeZone tz = DateTimeZoneProviders.Tzdb[location.TimeZone]; 
Instant instant = Instant.FromDateTimeUtc(theUtcDateTime); 
LocalTime localTime = instant.InZone(tz).TimeOfDay; 

を代替は、.NETに付属しているTimeZoneInfoオブジェクトと、Windowsのタイムゾーンを使用することです:

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(location.TimeZone); 
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(theUtcDateTime, tz); 
TimeSpan localTime = localDateTime.TimeOfDay; 
関連する問題