如何将棕色地块应用程序转换为使用基于用户的时区?

时间:2011-12-07 16:43:11

标签: asp.net sql-server timezone brownfield

我负责提出在棕地应用程序中实现用户特定时区的解决方案。存储在数据库中的每个日期都存储在服务器的本地时间中。这些日期没有存储时区或偏移信息。

这是一个非常大的应用程序,所以我意识到这将是很多工作。我担心的是,我们尽可能降低风险。有没有人这样做过?如果是这样,最好的方法是什么,以及要避免哪些陷阱?

目前的想法是我们将具有有意义时间组件的日期列中的所有数据转换为UTC。然后,在表示层中,我们需要运行一个函数,在我们需要向用户显示时,将日期时间对象从UTC转换为用户的时区。

这是一个带有SQL Server 2008数据库的ASP .NET应用程序。我之所以提到这一点,是因为在这些技术中可能有一些有用的工具我不知道我们可以用来帮助事情变得更顺畅。

1 个答案:

答案 0 :(得分:1)

新代码中的这种要求几乎完全适合T-SQL的新datetimeoffset数据类型。但是在遗留代码中,你会遇到一些问题。

有一篇关于名为The Death of DateTime?的新datetimeoffset类型的文章很好,它很好地探讨了datetime的问题。

简而言之,您需要解决以下问题:

  • 您可以排除哪些日期字段(即时间必须始终为00:00)。
  • 中记录了哪些时区记录了日期时间
  • 哪个时区有单独的夏令时或夏令时偏移
  • 中记录日期的所有年份,夏令时的具体日期范围是多少?
  • 如何计算数据中每个日期时间值的偏移量
  • 您将如何解释偏移更改时的重叠小时数

一旦你将数据分开,并计算出你刚刚调用的每个组的偏移量:

TODATETIMEOFFSET (expression , time_zone)

当您读取datetimeoffset时,您将获得以前的本地时间,以及记录时的UTC偏移量。

我说几乎是完美的,如果您需要将远程记录的日期时间从去年某个时间转换为当地时间,您需要知道记录时间时的本地偏移量。