5

私の状況では、データをSQL Serverデータベースに格納し、2005年以降をサポートしています。DateTime値が保存されるとき、それはクライアントの現地時間にあります。他のクライアントがどのタイムゾーンにいるかに関係なく、どこにいても他のクライアントでその日付を取り戻すことができる必要があります。

したがって、たとえば、ニューヨークのユーザーが「2012-12-20 00:00」のDateTime値を入力した場合、カリフォルニアのユーザーに同じDateTime値を表示させたいと思います。これらのDateTime値は、タイムゾーンの違いを尊重するべきではありませんが、それが私が起こっていることです。現在、SQLServerはそのDateTimeを「2012-12-1921:00」としてカリフォルニアのユーザーに配信します。ESTからPSTへの変更による-3時間のロールバックにより、現在は前日になっていることに注意してください(この会話では、DSTの問題については忘れてください)。

そのデータを逐語的に取得し、タイムゾーンごとに変換しないことは、私が達成する必要があることです。では、どのようなアドバイスを提供できますか?

考慮すべきいくつかのコード:

表は次のとおりです。

CREATE TABLE [dbo].[tblMeterReadings](
[fldMeterReadingsID] [int] IDENTITY(1,1) NOT NULL,
[fldMeterID] [int] NOT NULL,
[fldUser] [varchar](50) NULL,
[fldBy] [varchar](50) NULL,
[fldDateOfReading] [datetime] NULL,
[fldReading] [float] NULL,
[fldIsArchived] [bit] NULL DEFAULT ((0)),

作業を行うSqlクラスがあり、次の例では、「sql」はそのクラスのオブジェクトです。呼び出しは、パラメータ化されたクエリを使用して行われます。ここで、@ data0は、SQLのDateTimeフィールドに格納するDateTimeオブジェクトです。

sql.Execute(@"INSERT INTO tblMeterReadings (fldMeterID, fldDateOfReading) VALUES (" + MeterID + ", @data0)", Date);

最終的に、これはSqlCommandを設定し、パラメーターを割り当て、command.ExecuteNonQuery()呼び出しを起動します。

ここで、日付を取得するには、DataTableで日付を選択するだけです(ここでも、SQLクラスヘルパーを使用します)。

DataTable myTable = sql.readDataTable(@"SELECT fldMeterID, fldDateOfReading FROM tblMeterReadings");

つまり、データベース自体では、日付は予想どおり「2012-12-20 00:00」ですが、デバッグでmyTableの内容を調べると、そのテーブルの日付は「2012- 12-1921:00"。

データベースは、EST状態のマシンで実行されるSQLServer上に作成されました。ただし、私のマシンはPSTに設定されています。したがって、SELECTでDateTime値が配信される方法の違い。

私は何が欠けていますか?

4

3 に答える 3

2

UTC日付をデータベースに保存します。クライアントに表示する場合にのみ、現地時間に変換してください。

サーバー側、getutcdate()の代わりに使用しgetdate()ます。

于 2012-12-05T14:56:20.587 に答える
2

あなたの素晴らしい人々からのインプットとあなたの提案に沿ったいくつかの研究のおかげで、私たちは私たちの問題を解決しました。

支援とこのリンクを提供して くれたebyrobに特に感謝します: http ://support.microsoft.com/kb/842545

そのリンクは最終的に銀の弾丸であることが証明されました。

基本的な問題は、DataTableまたはDataSetを作成するときに、それが作成されたタイムゾーンに関する情報がエンコードされることです。次に、そのオブジェクトを別のタイムゾーン内に存在するマシンへの接続を介して渡すと、そこにあるDateTime値は、タイムゾーンの違いに基づいて調整されます。

その理解に照らして、修正はDateTimeModeすべてのDateTimeDataColumnsのプロパティをに設定することDataSetDateTime.Unspecifiedです。これにより、シリアル化後の日付調整が防止され、代わりにDateTime値が逐語的に配信されます。

また、この記事ではDataSetが指定されていることも指摘しておきますが、DataTableも脆弱であることが証明されています。実際、私はそれがDataColumn自体(とにかく、DateTimeのタイプを持つもの)に帰着することを確信しています。記事にもこれが記載されていると思います。

もう一度感謝します。私たちは今それを持っていると思います!

于 2012-12-05T19:21:36.407 に答える
1

特定のタイムゾーンの日付を表示したい場所ならどこでも、次のことができます。

DateTime dtDateOfReading = TimeZoneInfo.ConvertTime(
    Convert.ToDateTime(myTables.Rows[i]["fldDateOfReading"]), 
    dtTimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
    );

表示するタイムゾーンが複数ある場合は、日付または使用する顧客サイトのいずれかとともにタイムゾーンを保存する必要があります。

注:変換されたDateTime値には、場合によってはローカルであると(誤って)想定される可能性のある種類が指定されていないため、注意してください。

編集:SQL接続のタイムゾーンをSQL Serverのタイムゾーンと一致するように設定する方が簡単かもしれませんが、この記事:http ://support.microsoft.com/kb/842545は、タイムゾーンの構成が正しくない可能性があることを示しているようです。少なくともSqlDataAdapterでサポートされています。

于 2012-12-05T15:43:58.890 に答える