2017-09-24 85 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”。

希望这会有所帮助。