Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SQL Server上存储时区_C#_Sql Server_Timezone_Nodatime_Iana - Fatal编程技术网

C# 在SQL Server上存储时区

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标识符

我正在从事一项全球范围的日程安排服务,该服务使用不同时区的物理位置。 这些时区必须与每个位置一起保留在数据库中。 问题是,如何最好地存储它们

我们目前使用一个自定义时区表,它将自定义整数ID映射到Microsoft时区字符串标识符。 我希望存储IANA时区标识符。 我们的数据库是一个SQL Server,使用实体框架6在C#中访问。我们使用NodaTime来处理时间。 解决方案必须与所有这些技术配合使用

我看到两种不同的方法:

  • 只需将IANA标识符与每个位置一起存储为字符串
  • 将所有IANA标识符存储在单独的表中,并使用外键链接到该表
  • 第一个解决方案可能是最简单的,因为它很容易允许新的标识符,并将数据紧密地放在一起。 但是,它确实有占用大量空间的缺点

    第二种解决方案要求我们在每次需要时区时加入时区表,这是非常常见的,但只需要很少的空间。 如果需要,必须将新的时区标识符添加到该表中。 它还引入了这些神奇的整数ID(使用的外键),这可能会被误认为是常见的标识符(我们目前遇到了这个问题,其中ID已移出数据库,并被移到代码内字典中,而不是数据库表中)


    在我写这篇文章的时候,我想知道是否有可能为SQL Server创建一个自定义时区UDT,在这个UDT中,时区可以作为字符串标识符保存和加载,但可以更高效地以用户隐藏格式存储。

    虽然这两种方法都可以工作,通常的做法是将IANA时区标识符存储为字符串。它们确实是唯一的标识符,因此可以这样对待它们
    “America/Argentina/ComodRivadavia”
    是目前最大的字符串,有32个字符,因此一个
    varchar(32)
    就足够了。不过,我通常使用
    varchar(50)
    只是为了将来的安全


    通过规范化为查找表而节省的几千字节的存储空间通常不值得联接IMHO的性能影响。然而,与任何权衡一样,您应该评估这两个选项,看看哪一个更适合您的场景。使用查找表并不一定是错误的。

    为什么不将所有内容存储为UTC并在客户端应用程序中处理本地化?例如,这些位置可能是一家餐厅,它有当地的营业时间。这些营业时间取决于餐厅的位置,而不是观众的位置。此外,我们进行调度,因此未来时间必须存储在本地时间中,以便根据给定位置的时区将其正确转换为分区时间。此外,其中一个客户端是JS前端,在处理时区和夏令时时时,JS是一团乱麻。将日期存储在当地时间通常是一个坏主意,因为当地时间随着夏令时等的变化而变化。如果您将所有内容都存储在UTC中,并维护您的时区查找表,则您可以适应当地的变化,并准确、简单地转换到任何时区,无论是未来还是过去的用户还是地点。尝试将其存储为本地比简单地将其显示为本地更麻烦。存储本地时间对于安排未来事件是必要的,以防夏令时规则发生变化。如果规则改变,当地时间可能会有所不同。拜托,我知道怎么处理时间。我在问我应该如何以最好的方式在数据库中存储物理位置的时区。@iamdave-Mikkel在计划方面是正确的。“UTC始终”不一定是正确的-存在许多边缘情况。这将在《面向未来读者的快速更新》中介绍:虽然IANA 2017c规定了14个字符的最大长度,但它适用于区域或链接名称的各个部分,而不是整个字符串。因此,这里的建议仍然适用。