如何管理订单和时区相关问题?

How to manage orders and time zones related issues?

在电子商务应用中,

场景一

假设服务器在美国纽约,客户端在日本东京。客户下订单,需要在 10 天内交付。在该场景中,有两个时区,美国纽约和日本东京,并且有 10 天的承诺。

  1. 当客户下订单时,将多少时区详细信息输入到数据库中?
  2. 一位同事告诉我,我必须考虑 UTC,但它如何适应这一点?
  3. 当我计算10天时,这10天需要根据谁的时区计算?
  4. 任何人都可以给我一个好的 link 来说明这是如何处理的吗?

您需要始终将日期时间存储在 UTC 中。您可以通过调用GETUTCDATE()函数来获取当前的UTC时间。

因此,如果您有像 OrderDate 这样的字段来存储订单的日期和时间,则可以使用 DATEDADD 函数计算交货日期。如果您的设计需要,您可以将结果存储到另一列中。

示例:

DECLARE @OrderDate DATETIME
SET @OrderDate = '20150702 15:35:21'

SELECT  @OrderDate AS OrderDate
        ,DATEADD(DAY, 10, @OrderDate) AS DeliveryDate

输出

OrderDate                  DeliveryDate
2015-07-02 15:35:21.000    2015-07-12 15:35:21.000

当要显示日期和时间时,要按用户当地时间显示。您需要在表示层中格式化日期。尽管您在 SQL 服务器中有处理该问题的功能,但不要在数据库层对其进行格式化。

要获得合理合理的实施,您应该将日期存储为 UTC。这是一个独立于时区和夏令时的线性时间。

当您从数据库中读取时间并将其显示给用户时,您应该将其转换为他们当地的时区。在 .NET 中,您可以使用 TimeZoneInfo 对象将日期转换为特定时区。

When client makes the order how many time zone details are entered to database?

你只需要在数据库中存储UTC时间。这是一个准确的时间点,您可以稍后将其转换为任何本地时间。

When I calculate 10 days, based on whose time zone the 10 days needs to be calculated?

这取决于这 10 天的定义方式。您只需将 UTC 时间增加 10 天,您就会得到一个恰好 240 小时后的时间点。这意味着实际上您可能只有 9 天的时间进行送货,具体取决于下订单的时间以及一天中的什么时间可以送货。

这十天也可以定义为日历日,那么整个第十天都会包括在内,例如如果用户在 2015-07-02 03:26 下订单,它应该在他所在时区的 2015-07-12 23:59 之前到达。

您可以以 UTC 或通用格式(您的服务器时区)存储时间。当您显示时间时,它将转换为日本(根据您的情况)。您的后端在您的服务器时区中有时间,因此您可以使用它来计算时间。

增加 10 天。 将时间转换为服务器时间并增加 10 天。

所有的计算都这样,行得通。

我之前在某些代码库中使用过相同的方法,并且效果很好。