2008-10-21 35 views
13

我有一个我正在编写的Web应用程序(C#,MSSQL),我需要存储记录存储在系统中时的时间戳。通常,我只是用SQL和DATETIME函数来做到这一点。但是,服务器所在的时区与我们公司所在的时区不同......我们可能会在完全不同的时区更改为另一台服务器。托管公司不会更改服务器时间以匹配我们的当地时区。 (不是我责怪他们,但它是我试过的一件事。)如何处理在SQL中的时间存储

所以,我的问题是,什么是最好的方式来存储记录更新的日期/时间,什么是最好的方式来呈现日期/时间返回到我们当地时区的用户?

我希望做到这一点最麻烦的方式,所以只要解决方案易于实现,C#和SQL的组合就没有问题。 (我的正常风格是在存储过程中做更多的工作,而在C#中做的更少,如果这很重要。)

你能告诉我一些示例代码吗?谢谢!

回答

17

总是存储在通用时间DATETIME数据协调(UTC又名GMT)

  • 这避免了所有时区问题
  • 这避免日光节约时间问题
  • 这允许简单的日期数学总是可以工作的
  • 这可以让不同时区的交易保持同步
  • 这使您可以将数据移动到不同时区的不同服务器,并且不会将所有事情搞砸。
  • 等“通用”时间,有意义吗?

C#DateTime提供了DateTime.UtcNow和ToLocalTime(),SQL提供了GETUTCDATE()。这里有一个SQL函数UTC转换为本地时间 -

-- convert UTC to local time 
create FUNCTION [dbo].[udfUtcToLocalTime] 
(
    @gmt datetime 
) 
RETURNS datetime 
AS 
BEGIN 
    DECLARE @dt datetime 
    SELECT 
     @dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt) 
    RETURN @dt 
END 

例如:

SELECT dbo.udfUtcToLocalTime(someDateTimeField) 
FROM someTable 
+0

由于夏令时,timzeone偏移更改时,此功能将失败。 – 2008-12-22 18:37:47

7

在数据库中保存UTC时间和每一个你想他们展现给用户

+1

在您的存储过程中使用GETUTCDATE()而不是GETDATE()如果不是从应用程序提供。 – tvanfosson 2008-10-21 00:33:16

4

商店作为UTC时间,然后瓶坯在C#在客户端 时区计算时间定位的那些时间使用.ToUniversalTime( )在DateTime对象上获取UTC时间,将其存储在服务器上,然后使用.ToLocalTime()将其转换回来。

+0

这与我所做的类似,只不过我在C#中有自己的ToLocalTime扩展方法。这是因为网络服务器位于美国,但我希望时间表现为澳大利亚时代。 – Craig 2008-10-21 01:01:46