2

在一個電子商務應用程序,如何管理訂單和時區相關的問題?

方案1

假定服務器是在美國紐約州和客戶端是在日本東京。客戶下訂單,需要在10天內交付。在這種情況下,有兩個時區紐約,美國和東京,日本,並有10天的承諾。

  1. 當客戶端發出訂單時,有多少時區詳細信息輸入數據庫?
  2. 一位同事告訴我,我必須考慮一下UTC,但這是否適合於此?
  3. 當我計算10天時,根據哪個時區需要計算10天?
  4. 任何人都可以給我一個很好的鏈接,顯示如何處理?
+2

UTC(協調世界時)是這個詞。另外,請看https://github.com/nodatime/nodatime – naveen

回答

2

要獲得任何合理理智的實現,您應該將日期存儲爲UTC。這是一個與時區和夏令時無關的線性時間。

當您從數據庫中讀取時間並將其顯示給用戶時,應將其轉換爲其當地時區。在.NET中,您可以使用TimeZoneInfo對象將日期轉換爲特定時區。

當客戶端發出訂單時有多少時區詳細信息輸入到 數據庫?

您只需要將UTC時間存儲在數據庫中。這是一個確切的時間點,您可以稍後轉換爲任何當地時間。

當我計算10天時,根據哪個時區需要計算10天需要計算的 ?

這取決於如何定義這10天。您只需在UTC時間添加10天,即可獲得恰好240小時後的時間點。這意味着您實際上可能只有九天的時間來完成交付,具體取決於訂單的下達時間以及您可以在什麼時間交貨。

那10天也可以定義爲日曆日,然後將包括整個第10天,例如,如果用戶在2015-07-02 03:26下訂單,則應在2015-07-12 23:59之前到達他的時區。

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中具有處理該功能的功能,但不會在數據庫層中對其進行格式化。

1

您可以使用UTC或通用格式(您的服務器時區)存儲時間。當你顯示時間將被轉換爲日本(根據你的情況)。您的後端在您的服務器時區中有時間,因此您可以使用它來計算時間。

增加10天。 將時間轉換爲服務器並添加10天。

這樣做的所有計算,它會起作用。

我以前在一些代碼庫中使用了同樣的方法,這很好。