在一個電子商務應用程序,如何管理訂單和時區相關的問題?
方案1
假定服務器是在美國紐約州和客戶端是在日本東京。客戶下訂單,需要在10天內交付。在這種情況下,有兩個時區紐約,美國和東京,日本,並有10天的承諾。
- 當客戶端發出訂單時,有多少時區詳細信息輸入數據庫?
- 一位同事告訴我,我必須考慮一下UTC,但這是否適合於此?
- 當我計算10天時,根據哪個時區需要計算10天?
- 任何人都可以給我一個很好的鏈接,顯示如何處理?
在一個電子商務應用程序,如何管理訂單和時區相關的問題?
方案1
假定服務器是在美國紐約州和客戶端是在日本東京。客戶下訂單,需要在10天內交付。在這種情況下,有兩個時區紐約,美國和東京,日本,並有10天的承諾。
要獲得任何合理理智的實現,您應該將日期存儲爲UTC。這是一個與時區和夏令時無關的線性時間。
當您從數據庫中讀取時間並將其顯示給用戶時,應將其轉換爲其當地時區。在.NET中,您可以使用TimeZoneInfo
對象將日期轉換爲特定時區。
當客戶端發出訂單時有多少時區詳細信息輸入到 數據庫?
您只需要將UTC時間存儲在數據庫中。這是一個確切的時間點,您可以稍後轉換爲任何當地時間。
當我計算10天時,根據哪個時區需要計算10天需要計算的 ?
這取決於如何定義這10天。您只需在UTC時間添加10天,即可獲得恰好240小時後的時間點。這意味着您實際上可能只有九天的時間來完成交付,具體取決於訂單的下達時間以及您可以在什麼時間交貨。
那10天也可以定義爲日曆日,然後將包括整個第10天,例如,如果用戶在2015-07-02 03:26下訂單,則應在2015-07-12 23:59之前到達他的時區。
您需要始終將您的日期時間存儲在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中具有處理該功能的功能,但不會在數據庫層中對其進行格式化。
您可以使用UTC或通用格式(您的服務器時區)存儲時間。當你顯示時間將被轉換爲日本(根據你的情況)。您的後端在您的服務器時區中有時間,因此您可以使用它來計算時間。
增加10天。 將時間轉換爲服務器並添加10天。
這樣做的所有計算,它會起作用。
我以前在一些代碼庫中使用了同樣的方法,這很好。
UTC(協調世界時)是這個詞。另外,請看https://github.com/nodatime/nodatime – naveen