2009-11-10 8 views
5

私はSQLからデータを読み込み、これと同様に、クライアントアプリケーションにWCF経由で送信したアプリケーションを持っている:DataTime.FillでDateTime値をDateTimeKind.Utcにデフォルト設定しますか?

SqlDataAdapter da = new SqlDataAdapter(cmd) 
DataSet ds = new DataSet(); 
da.Fill(ds); 
return ds; 

すべての日付/時刻をUTCとしてデータベースに格納されています。私が気づいたのは、アプリケーションを実行しているコンピュータの時計が歪んでいると、クライアントが受け取った日付/時刻も歪んでしまうことです。 DateTime型が指定されていない種類の場合、WCFはそれをローカル時刻として内部的に表現して送信するので、アプリケーションとクライアントの間の時間差によって日付/時刻が移動するように見えます。

データセットを取得して日付/時刻フィールドを修正すると確かにデータセットを調べることができましたが、ここで誰かがデータセットを埋めるより良い方法を考えているので、すべてのDateTimeフィールドが自動的にDateTimeKind.Utc on da.Fill ()?

答えて

15

SQL Server 2008を使用している場合は、SQLのdatetimeの代わりにSQL datetimeoffsetデータ型を使用することが「適切な」ソリューションです。 datetimeoffsetは、SQL 2008に新しく追加されたタイムゾーン対応の日付/時刻型で、ADO.NETでCLR System.DateTimeOffset型に変換されます。この型は常にUTCからの相対的なものです。これについては、blog postを参照してください。 first few search results on MSDN for DateTimeOffsetは、追加の背景情報を提供します。

SQLスキーマを変更できない場合、ADO.NETには、この状況のカスタムプロパティがあります。DataColumn.DateTimeModeは、データセットのシリアル化時にローカルタイムゾーンを追加するかどうかを制御します(DateTimeMode=DataSetDateTime.UnspecifiedLocal、デフォルト)。シリアライズ時にタイムゾーン情報が追加されないかどうか(DateTimeMode=DataSetDateTime.Unspecified)。あなたは後者が欲しい。

私のMSDNドキュメントの読者が正しい場合は、DataSetの記入後にDataColumnDateTimeMode=DataSetDateTime.Unspecifiedを設定する必要があります。これは、タイムゾーンなしで列をシリアル化する必要があります。

本当に適切である(または上記の方法で問題が解決しない場合)場合は、先にDataTableを作成し、その列のDateTimeMode=DataSetDateTime.UtcFillの前に設定して行にすることができます。その後、UTCとして日付を送信することが保証されます。

+0

"DataSetが埋められた後、問題のDataColumnに対してSet DateTimeMode = DataSetDateTime.Unspecified"が完全に機能しました。ありがとう! – galets

+0

クールで、喜んで助けてください。 –

+0

JSON形式のDateTime値で送信されたオフセットを削除するには、 'DateTimeMode = DataSetDateTime.Utc'を設定します。 – Suncat2000

関連する問題