我负责提出在棕地应用程序中实现用户特定时区的解决方案。存储在数据库中的每个日期都存储在服务器的本地时间中。这些日期没有时区或偏移量信息。
这是一个非常大的应用程序,所以我意识到这将是大量的工作。我担心的是我们这样做的风险越小越好。以前有人这样做过吗?如果是这样,最好的方法是什么,要避免哪些陷阱?
当前的想法是,我们将日期列中具有有意义的时间组件的所有数据转换为UTC。然后,在表示层,我们需要运行一个函数,在需要显示给用户时将datetime对象从UTC转换为用户的时区。
这是一个asp.net应用程序与SQL Server 2008数据库。我提到这一点是因为在这些技术中可能有一些我不知道的有用的工具,我们可以用它们来帮助事情变得更顺利。
新代码中的这种需求几乎非常适合T-SQL的新datetimeoffset数据类型。但是在遗留代码中,你会遇到一些问题。
有一篇关于新的datetimeoffset类型的好文章叫做the Death of DateTime?它很好地探讨了datetime的问题。简而言之,以下是你需要解决的问题:
- 可以排除哪些仅限日期的字段(即时间必须始终为00:00)。 中记录了哪些时区的日期时间?
- 哪些时区有单独的夏令时或夏令时偏移
- 在 中记录日期的所有年份,夏令时的确切日期范围是什么?
- 如何计算出数据中每个日期时间值的偏移量
- 如何解释偏移变化时的重叠时间
一旦你把数据分开,并计算出每组的偏移量,你只需调用:
TODATETIMEOFFSET (expression , time_zone)
当你读取一个datetimeoffset时,你得到的是和以前一样的本地时间,加上从UTC记录时的偏移量。
我说这几乎是完美的,如果您需要将远程记录的日期时间从去年的某个时间转换为本地时间,您需要知道记录时间时的本地偏移量。