【问题标题】:Change existing ASP .NET web application to support multiple time zones更改现有的 ASP .NET Web 应用程序以支持多个时区
【发布时间】:2014-04-04 04:50:42
【问题描述】:

我有一个包含 70 多个项目的现有 Web 应用程序; DB:700 多个表,500 多个存储过程。 目前有很多带有日期时间/日期字段的表。

在数据库中保存日期/日期时间信息时,我需要将它们更改为 UTC 以支持多个时区(因为将跨多个区域访问该应用程序 - 服务器也可以托管在多个区域;目前它被访问仅来自一个地区)

为了做到这一点,我想出了以下步骤:

  1. 获取带有日期/日期时间字段的表格列表。
  2. 检查其日期时间字段的填充方式(即通过应用程序或通过程序)
  3. 列表项。
  4. 将日期时间转换为 UTC,然后再将其保存到 DB。
  5. 在用户浏览器中显示时,将时间转换回用户的时区。
  6. 可以编写查询以使用 UTC 更新现有值。

问题是应用程序本身非常庞大,并且更新日期时间的地方太多(来自应用程序和程序);虽然我可以直接通过查询获得表/过程名称的列表,但是更新每个过程(后端)/文件(前端)是一个非常繁琐的过程

我想知道在这种情况下继续进行的最佳方法/建议(更改应用程序以支持多个时区且更改最少)。

谢谢!

【问题讨论】:

    标签: asp.net sql datetime utc


    【解决方案1】:

    理想的情况是所有日期都是UTC,在存储过程中,在过程代码中,在API接口中等等。

    它不应该是 UTC 的唯一时间是直接在为人类用户呈现之前

    当您指定一个 Web 应用程序时,这应该仅与 HTML 呈现区域隔离,并且这应该是您在将 DB 切换为 UTC 后需要更改的唯一代码

    您应该只需要更改两个函数:

    1. 将人工输入解码为有效日期并从该会话时区转换为 UTC(在任何其他处理逻辑之前执行此操作)
    2. 将日期值从 UTC 转换为当前会话时区,并格式化为人类可读的形式(在显示日期之前执行此操作)

    这两个函数应该已经存在于你的 UI 代码中用于日期格式化和验证,它们只需要 tweeking

    【讨论】:

    • 他已经很清楚应该如何了。他的问题是问他如何在他非常庞大而复杂的应用程序中实现这一点,而无需手动完成所有操作。
    • 不,你是在告诉他应该如何设计。您还没有解决这样一个事实,即他有数百个对当前(特定于区域设置)时间条目(即 GETDATE())进行硬编码的存储过程,也没有解决他可能执行DateTime.Now 的大量代码。对于他当前的所有代码,仅更改这些内容对他没有任何帮助。谁在乎使用哪个代词?
    • 他说“问题是应用程序本身非常庞大,并且有太多地方(来自应用程序和过程)更新日期时间”,这表明他的存储过程专门设置时间(即 GETDATE()),并且他有很多专门设置时间的代码(即很可能是 DatetTime.Now)。仅仅因为他没有具体说出来并不意味着你应该假设它们不存在。
    • 至于“易于实现”,这不是..“他们”的整个问题是基于“他们”不想手动更新数百个“他们的”代码这一事实当前正在对日期进行硬编码的地方。你没有提供如何解决这个问题的建议,这是“他们”问题的主要目的,你完全忽略了它。相反,您认为问题不存在,他们应该更努力地查看“他们的”代码,以便更改两个地方。坦率地说,告诉他们他们的问题不存在比称他们为“他”更侮辱人
    • ... 这将自动向您显示您的应用程序中断并需要更改的地方(如果经过彻底测试或您的代码中存在某种形式的类型安全),例如您可以只使用一个数字来存储自 Unix 纪元以来的毫秒数。这可以用您使用的任何客户端设备/编程语言很好地解释。所以我会写一个层来强制其他方法在处理时间的东西时调用这个层,这样你就可以更好地控制未来的数据库更改。
    【解决方案2】:

    对你来说已经太晚了,但是在设计一个为任何记录更改添加日期戳的应用程序时,正确的做法是编写一个适当设置日期的 SQL 触发器。

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 2019-06-27
      • 2014-07-29
      • 2022-11-05
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多