- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,它可以从 SQL 读取数据并通过 WCF 将其发送到客户端应用程序,其方式与此类似:
SqlDataAdapter da = new SqlDataAdapter( cmd )
DataSet ds = new DataSet();
da.Fill( ds );
return ds;
所有日期/时间均以 UTC 形式存储在数据库中。我注意到,如果运行应用程序的计算机上的时钟出现偏差,则客户端收到的日期/时间也会出现偏差。看来,如果 DateTime 类型是未指定的类型,WCF 会在内部将其表示为本地时间,并按此发送,因此应用程序和客户端之间的任何时间差异都会导致日期/时间发生变化。
我当然可以在检索数据集时对其进行检查并修复日期/时间字段,但是这里有人会想到一些更好的方法来填充数据集,以便每个 DateTime 字段都会自动成为 da.Fill 上的 DateTimeKind.Utc( )?
最佳答案
如果您使用的是 SQL Server 2008,那么“正确”的解决方案是使用 SQL datetimeoffset
数据类型而不是 SQL 的日期时间。 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 后为相关的 DataColumn
设置 DateTimeMode=DataSetDateTime.Unspecified
。这应该序列化没有时区的列。
如果您想要真正正确(或者万一上述方法不起作用),您可以提前创建 DataTable
并设置该列的 DateTimeMode=DataSetDateTime.Utc
在用行填充
之前。然后您就可以放心发送 UTC 日期。
关于.net - 如何使用默认为 DateTimeKind.Utc 的 DateTime 值进行 DataSet.Fill?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712039/
我是一名优秀的程序员,十分优秀!