2017-09-24 84 views
0

我正在創建一個應用程序,它需要能夠處理來自多個時區的用戶並正確顯示其特定時區的日期。在時區,處理多個時區

我已經創建了下面的代碼作爲我得到的例子,但是我對處理時區問題的正確方法有些困惑。

最好是通過將數據庫中的所有日期存儲爲UTC並相應地使用AT TIME ZONE來完成此操作,還是應該考慮另一種方式?

Create Table #Test 
(
    SampleDate datetimeoffset(7) 
) 

Create Table #Test2 
(
    SampleDate datetimeoffset(7) 
) 

Create Table #Test3 
(
    SampleDate datetime 
) 

insert into #Test select getdate() 
insert into #Test2 select getdate() AT TIME ZONE 'AUS Eastern Standard Time' 
insert into #Test3 select getdate() 


select 
    SampleDate, 
    SampleDate AT TIME ZONE 'AUS Eastern Standard Time', 
    SampleDate AT TIME ZONE 'AUS Central Standard Time', 
    SampleDate AT TIME ZONE 'Aus Central W. Standard Time' 
from #Test 

select 
    SampleDate, 
    SampleDate AT TIME ZONE 'AUS Eastern Standard Time', 
    SampleDate AT TIME ZONE 'AUS Central Standard Time', 
    SampleDate AT TIME ZONE 'Aus Central W. Standard Time' 
from #Test2 

select 
    SampleDate, 
    SampleDate AT TIME ZONE 'AUS Eastern Standard Time', 
    SampleDate AT TIME ZONE 'AUS Central Standard Time', 
    SampleDate AT TIME ZONE 'Aus Central W. Standard Time' 
from #Test3 

drop table #Test 
drop table #Test2 
drop table #Test3 

測試結果

2017-09-24 10:59:47.4233333 +00:00 
2017-09-24 20:59:47.4233333 +10:00 
2017-09-24 20:29:47.4233333 +09:30 
2017-09-24 19:44:47.4233333 +08:45 

Test2的結果

2017-09-24 10:59:47.4230000 +10:00 
2017-09-24 10:59:47.4230000 +10:00 
2017-09-24 10:29:47.4230000 +09:30 
2017-09-24 09:44:47.4230000 +08:45 

Test3的結果

2017-09-24 10:59:47.423 
2017-09-24 10:59:47.423 +10:00 
2017-09-24 10:59:47.423 +09:30 
2017-09-24 10:59:47.423 +08:45 
+0

如果您需要不同的時區,請使用'datetimeoffset'。這就是它的目的。 –

+0

謝謝@GordonLinoff,但是你應該在表格中存儲什麼?你是否總是儲存UTC或你是否儲存特定用戶的日期/時間和抵消? – Philip

+0

。 。哦,這取決於他們如何使用。我想我傾向於將它們存儲在同一個時區,但在當地多個時間存儲它們是有正當理由的。 –

回答

0

SQL Azure數據庫始終使用UTC時間。出於這個原因,你應該使用datetimeoffset。

您還應該使用sysdatetimeoffset()捕獲系統日期,而不是使用getdate()。

當您從數據庫表中檢索日期時,應該使用「AT TIME ZONE」。

希望這會有所幫助。