C# 在SQL Server上存储时区
我正在从事一项全球范围的日程安排服务,该服务使用不同时区的物理位置。 这些时区必须与每个位置一起保留在数据库中。 问题是,如何最好地存储它们 我们目前使用一个自定义时区表,它将自定义整数ID映射到Microsoft时区字符串标识符。 我希望存储IANA时区标识符。 我们的数据库是一个SQL Server,使用实体框架6在C#中访问。我们使用NodaTime来处理时间。 解决方案必须与所有这些技术配合使用 我看到两种不同的方法:C# 在SQL Server上存储时区,c#,sql-server,timezone,nodatime,iana,C#,Sql Server,Timezone,Nodatime,Iana,我正在从事一项全球范围的日程安排服务,该服务使用不同时区的物理位置。 这些时区必须与每个位置一起保留在数据库中。 问题是,如何最好地存储它们 我们目前使用一个自定义时区表,它将自定义整数ID映射到Microsoft时区字符串标识符。 我希望存储IANA时区标识符。 我们的数据库是一个SQL Server,使用实体框架6在C#中访问。我们使用NodaTime来处理时间。 解决方案必须与所有这些技术配合使用 我看到两种不同的方法: 只需将IANA标识符与每个位置一起存储为字符串 将所有IANA标识符
在我写这篇文章的时候,我想知道是否有可能为SQL Server创建一个自定义时区UDT,在这个UDT中,时区可以作为字符串标识符保存和加载,但可以更高效地以用户隐藏格式存储。虽然这两种方法都可以工作,通常的做法是将IANA时区标识符存储为字符串。它们确实是唯一的标识符,因此可以这样对待它们
“America/Argentina/ComodRivadavia”
是目前最大的字符串,有32个字符,因此一个varchar(32)
就足够了。不过,我通常使用varchar(50)
只是为了将来的安全
通过规范化为查找表而节省的几千字节的存储空间通常不值得联接IMHO的性能影响。然而,与任何权衡一样,您应该评估这两个选项,看看哪一个更适合您的场景。使用查找表并不一定是错误的。为什么不将所有内容存储为UTC并在客户端应用程序中处理本地化?例如,这些位置可能是一家餐厅,它有当地的营业时间。这些营业时间取决于餐厅的位置,而不是观众的位置。此外,我们进行调度,因此未来时间必须存储在本地时间中,以便根据给定位置的时区将其正确转换为分区时间。此外,其中一个客户端是JS前端,在处理时区和夏令时时时,JS是一团乱麻。将日期存储在当地时间通常是一个坏主意,因为当地时间随着夏令时等的变化而变化。如果您将所有内容都存储在UTC中,并维护您的时区查找表,则您可以适应当地的变化,并准确、简单地转换到任何时区,无论是未来还是过去的用户还是地点。尝试将其存储为本地比简单地将其显示为本地更麻烦。存储本地时间对于安排未来事件是必要的,以防夏令时规则发生变化。如果规则改变,当地时间可能会有所不同。拜托,我知道怎么处理时间。我在问我应该如何以最好的方式在数据库中存储物理位置的时区。@iamdave-Mikkel在计划方面是正确的。“UTC始终”不一定是正确的-存在许多边缘情况。这将在《面向未来读者的快速更新》中介绍:虽然IANA 2017c规定了14个字符的最大长度,但它适用于区域或链接名称的各个部分,而不是整个字符串。因此,这里的建议仍然适用。