在DataSet.GetXml()之后从UTC转换的日期时间不正确

本文关键字:转换 日期 时间 不正确 UTC GetXml DataSet 之后 | 更新日期: 2023-09-27 17:50:49

我的应用程序通过web服务调用提取对象,将其放入类型化数据集,并将DataSet.GetXml()发送给存储过程在数据库上进行插入/更新。

我面临的问题是对象的两个属性: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()));
        }
}

在DataSet.GetXml()之后从UTC转换的日期时间不正确

好的,我发现为什么utc时间被转换为"不正确的本地时间"。类型化数据集中的'Startime'/'EndTime'字段的类型是'DateTime'。有一个与DateTime类型的datacoluml相关联的属性称为'DateTimeMode',默认设置为'UnspecifiedLocal'。http://msdn.microsoft.com/en-us/library/system.data.datasetdatetime.aspx

基本上,该选项将偏移量添加到datetime值而不转换它。作为测试,我将'DateTimeMode'更改为'Utc'并重试。从DataSet.GetXml()接收到的XML能够正确转换值:"2012-11-06T05:00:00Z"

作为我的问题的解决方案,我保持属性为' unspecificedlocal ',因为它是。相反,在将值添加到数据集中时,我将其转换为本地时间。

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

(注意,这对我来说是有效的,因为我的应用服务器和数据库服务器在同一个时区,转换到UTC并不复杂。)