我们正在C# 4中开发一个应用程序,它使用Server 2008 R2作为后端。SQLServerCompact4也用于很少几种罕见情况下断开连接的客户端。我们想知道在这些数据库中存储日期/时间数据的最佳方法是什么,以便:
我们的主要关注点是为每个记录的事件保留本地时间,但不丧失比较和排序从不同时区生成的事件从而具有不同时间偏移的能力。
我们考虑了datetimeoffset
数据类型,因为它存储时间偏移量,也因为它很好地映射到.NET的DateTimeOffset
。但是,SQLServerCompact4不支持它。另一种方法是从数据库中删除偏移量信息,并使用简单的datetime
数据类型,这样数据库中的每一段数据都可以标准化,使用Compact的问题也更少。然而,这带来了一个问题,即在用户看到数据之前,需要在检索时以某种方式重建偏移信息。
因此,我的问题是,对于如何在Server中存储日期/时间值,考虑到我们需要处理不同的时区,并使2008年R2和Compact4之间的互操作性尽可能容易,是否有最佳实践或指导方针?
谢谢。
发布于 2013-06-27 08:41:17
听起来相关的要点如下:
DateTimeOffset
在这种情况下,DateTimeOffset
基本上是最合适的类型。您应该确保团队中的每个人都清楚这意味着什么--偏移量是数据最初接收时的偏移量。如果您想在不同的时区中及时显示该瞬间,则实际上需要返回UTC,并找出该显示时区中的偏移量。很容易对这类事情感到困惑:)
如果您需要完全保真度地维护SqlServerCE中的数据,您可能需要一个DateTime字段,然后需要一个单独的偏移字段(例如分钟,或者作为TimeSpan (如果SqlServerCE支持的话))。
发布于 2013-06-27 09:02:04
在服务器上使用DateTimeOffset
可能是正确的。您可能还想在DateTime vs DateTimeOffset上阅读我的答案。
在您使用SQLCE的客户端上,使用UTC值存储一个DateTime
。当您将数据发送到服务器时,可以使用客户端的本地时区来确定UTC值对应的DateTimeOffset
。
如果用户可能正在更改他们的时区,那么您可能还需要将时区的id存储在客户端数据库中。但是你可以在转换过程中使用这个。除非您在服务器或其他客户端上编辑这些值,否则不需要将其发送到服务器。
不要尝试将时间存储在客户端的本地时间。你会遇到异能。例如,当夏令时倒转时,您不希望相同的本地时间有两个不同的UTC时间。
发布于 2013-06-27 04:59:33
为什么不使用datetime并始终将值存储为UTC值,然后在需要时将其格式化为最终用户(显示)时区。
https://stackoverflow.com/questions/17343214
复制相似问题