如何管理订单和时区相关问题?
How to manage orders and time zones related issues?
在电子商务应用中,
场景一
假设服务器在美国纽约,客户端在日本东京。客户下订单,需要在 10 天内交付。在该场景中,有两个时区,美国纽约和日本东京,并且有 10 天的承诺。
- 当客户下订单时,将多少时区详细信息输入到数据库中?
- 一位同事告诉我,我必须考虑 UTC,但它如何适应这一点?
- 当我计算10天时,这10天需要根据谁的时区计算?
- 任何人都可以给我一个好的 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 天。
所有的计算都这样,行得通。
我之前在某些代码库中使用过相同的方法,并且效果很好。
在电子商务应用中,
场景一
假设服务器在美国纽约,客户端在日本东京。客户下订单,需要在 10 天内交付。在该场景中,有两个时区,美国纽约和日本东京,并且有 10 天的承诺。
- 当客户下订单时,将多少时区详细信息输入到数据库中?
- 一位同事告诉我,我必须考虑 UTC,但它如何适应这一点?
- 当我计算10天时,这10天需要根据谁的时区计算?
- 任何人都可以给我一个好的 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 天。
所有的计算都这样,行得通。
我之前在某些代码库中使用过相同的方法,并且效果很好。