2

私のアプリは、Web サービス呼び出しを介してオブジェクトを取得し、それを型指定されたデータセットに入れDataSet.GetXml()、データベースでの挿入/更新のためにストアド プロシージャに送信します。

私が直面している問題は、オブジェクトの 2 つのプロパティにあります: StartTime/ EndTime. Web サービスはこれらを UTC 形式で送信します。例えば。サンプルStartTime-> "2012-11-06T05:00:00Z"DataSet.GetXml()この UTC 値を現地時間に変換しようとしています。私のアプリ サーバーは EST です。結果の値は「2012-11-06T00:00:00-05:00」と報告されるはずですが、代わりに「2012-11-06T05:00:00-05:00」です。オフセット値が追加されていますが、時間コンポーネントは変更されていません。

ここで私の理解に誤りがありますか?メソッドにそのようなバグがある可能性があることを理解するのは難しいと感じてGetXml()います。また、ここで同様の問題を訴えている人は他にいません。

コードの簡略版は次のとおりです。

public void SaveOrder(int intOrderID)
{
        OrderDataSet objOrderDS = null;
        OrderDataSet.OrdersRow objOrderRow = null;
        ExternHandler handler = null;
        Order objOrder;

        Order objOrder = handler.GetOrder(intOrderID);

        objOrderRow = objOrderDS.Orders.NewOrdersRow();
        objOrderRow.OrderID = objOrder.OrderID;
        objOrderRow.StartTime = objOrder.StartTime;
        objOrderRow.EndTime = objOrder.EndTime;
        objOrderDS.Orders.AddOrdersRow(objOrderRow);

        if (objOrderDS.Orders.Rows.Count > 0)
        {
            objOrderDS.Namespace = string.Empty;
            objMappingObjects.Add(new MappingObject("Table", "Orders"));
            objSqlParams.Add(new SqlParameter("@pOrdersXml", objOrderDS.GetXml()));
            objOrderDS.Clear();
            objOrderDS.Merge(SqlHelper.ExecuteDataset(ConfigConnectionDB.Trim(), CommandType.StoredProcedure, "usp_InsertOrderMetaData", objMappingObjects.ToArray(), objSqlParams.ToArray()));
        }
}
4

1 に答える 1

1

OK、UTC時刻が「誤った現地時間」に変換されている理由を見つけました。型指定されたデータセットのフィールド「Startime」/「EndTime」は「DateTime」型です。デフォルトで「UnspecificLocal」に設定されている「DateTimeMode」と呼ばれるDateTimeタイプのDataColumnに関連付けられたプロパティがあります。 http://msdn.microsoft.com/en-us/library/system.data.datasetdatetime.aspx

基本的に、このオプションは、日時値を変換せずに、日時値にオフセットを追加します。テストとして、「DateTimeMode」を「Utc」に変更して再試行しました。DataSet.GetXml()から受信したXMLは、値を正しく変換できました: "2012-11-06T05:00:00Z"

私の問題の解決策として、プロパティを「UnspecificLocal」のままにしています。代わりに、データセットに値を追加するときに、それを現地時間に変換します。

    objOrderRow.EndTime = objOrder.EndTime.ToLocalTime();

(私のアプリサーバーとデータベースサーバーは同じタイムゾーンにあり、UTCへの変換は複雑ではないため、これは私にとってはうまくいくことに注意してください。)

于 2013-01-08T12:46:13.953 に答える