我的应用程序通过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()));
}
}
答案 0 :(得分:1)
好的,我发现为什么UTC时间被转换为“不正确的本地时间”。类型化数据集中的“Startime”/“EndTime”字段的类型为“DateTime”。有一个与DateTime类型的DataColumn相关联的属性,名为'DateTimeMode',默认情况下设置为'UnspecifiedLocal'。 http://msdn.microsoft.com/en-us/library/system.data.datasetdatetime.aspx
基本上,此选项会将偏移量添加到日期时间值而不进行转换。作为测试,我将'DateTimeMode'更改为'Utc'并重试。从DataSet.GetXml()收到的XML能够正确转换值:“2012-11-06T05:00:00Z”
作为我的问题的解决方案,我将属性保持为'UnspecifiedLocal'。相反,在将值添加到数据集时,我将其转换为本地时间。
objOrderRow.EndTime = objOrder.EndTime.ToLocalTime();
(请注意,这对我有用,因为我的应用服务器和数据库服务器位于同一时区,并且转换为UTC并不复杂。)