2016-11-25 5 views
0

UTC値をローカルタイムに変換したDateTime列を使用してソートされたDataGridがあります。問題はDSTにあります(11月6日午前2:00:00から午前1:00:00に戻ってくる)1時間が繰り返されるためです。私はすでに、IComparableから継承するクラスを使用して列を比較する方法を実装し、ToUniversalTime()を使用して日付を手動で比較しますが、間違った値を返します。説明するために、より良い私は例を示しましょう:表示DTCを保持するUTCへのLocalTime

 DataTable table = new DataTable(); 
     table.Columns.Add("UTC Date", typeof(DateTime)); 
     table.Columns.Add("Local Date", typeof(DateTime));    
     table.Columns.Add("UTC From Local", typeof(DateTime)); 
     dataGridView1.DataSource = table; 
     DateTime aux; 

     DataRow newRow = table.NewRow(); 
     aux = new DateTime(2016, 11, 06, 06, 30, 0, DateTimeKind.Utc); 
     newRow["UTC Date"] = aux; 
     newRow["Local Date"] = aux.ToLocalTime(); 
     newRow["UTC From Local"] = Convert.ToDateTime(newRow["Local Date"]).ToUniversalTime(); table.Rows.Add(newRow); 

値は次のようになります。

UTC日:2016年11月6日6:30

現地日:2016年11月6日1:30

現地からUTC:2016年11月6日7:30

あなたが見ることができるようにコラム「ローカルからUTC」は間違っているか、少なくとも私は、午前6時30分(考慮DSTを期待します)で、7:30(DSTなし)ではありません。

help ?????

答えて

0

あなたは心の中でのDataColumnのDateTimeMode性質を維持する必要があります。新しいDataColumnを作成すると、未指定に設定されます。しかし、あなたのユースケースであなたはUTCとローカル

var table = new DataTable(); 
table.Columns.Add("UTC Date", typeof(DateTime)).DateTimeMode = DataSetDateTime.Utc; 
table.Columns.Add("Local Date", typeof(DateTime)).DateTimeMode = DataSetDateTime.Local; 
table.Columns.Add("UTC From Local", typeof(DateTime)).DateTimeMode = DataSetDateTime.Utc; 

var newRow = table.NewRow(); 
var aux = new DateTime(2016, 11, 06, 06, 30, 0, DateTimeKind.Utc); 
newRow["UTC Date"] = aux; 
newRow["Local Date"] = aux.ToLocalTime(); 
newRow["UTC From Local"] = Convert.ToDateTime(newRow["Local Date"]).ToUniversalTime(); 
+0

ありがとう!それは働いた、私は実際のアプリにこのソリューションを実装しようとすると、私が投稿したものがまさに例であった。あなたのソリューションを読んで、私は 'ToLocalTime()'を使ってもDST情報を失わないと思うことができます。問題は、 'DateTimeMode'を指定しなかったDataTableを作成するときでした。 –

-1

たぶん、あなたはGTMオフセットを取得しようとすると、あなたの「ローカルからUTC」に追加することができます:

aux = new DateTime(2016, 11, 06, 06, 30, 0, DateTimeKind.Utc); 
newRow["UTC Date"] = aux; 
newRow["Local Date"] = aux.ToLocalTime(); 
TimeSpan UtcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(aux); 
newRow["UTC From Local"] = Convert.ToDateTime(newRow["Local Date"].Add(UtcOffset)).ToUniversalTime(); 
+0

私は理解していないしたいです。あなたはUTCで 'GetUtcOffset'を呼び出しますか?あなたは何を期待していますか? –

+0

私はUTCで 'GetUtcOffset'を呼び出すと0が得られると思います。とにかくDSTの日付から取得しても、DSTからの日付は同じオフセットになります。唯一の違いは 'IsDaylightSavingTime()'を呼び出すことだと私は信じています –

関連する問題