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

时间:2015-07-02 02:30:13

标签: sql asp.net entity-framework asp.net-mvc-4 sql-server-2008-r2

在电子商务应用中,

情景1

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

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

3 个答案:

答案 0 :(得分:2)

要获得任何合理的理解,您应该将日期存储为UTC。这是一个与时区和夏令时无关的线性时间。

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

  

当客户端下订单时输入了多少时区详细信息   数据库?

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

  

当我计算10天时,根据10天所需的时区   要计算?

这取决于如何定义这10天。您只需将10天添加到UTC时间,就可以获得恰好240小时后的时间点。这意味着您实际上只需要九天的时间来完成交货,具体取决于订单的下达时间以及您可以交货的时间。

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

答案 1 :(得分:1)

您需要始终将日期时间存储在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 Server中有函数可以处理,但不要在数据库层中对其进行格式化。

答案 2 :(得分:1)

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

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

以这种方式进行所有计算,它都可以。

我以前在某些代码库中使用过相同的方法,这很好。