C# 如何处理SQL中的时间存储

C# 如何处理SQL中的时间存储,c#,sql,time,C#,Sql,Time,我有一个正在编写的web应用程序(C#,MSSQL),我需要在系统中存储记录时存储时间戳。通常,我只需要使用SQL和DATETIME函数就可以做到这一点。但是,服务器所在的时区与我们公司所在的时区不同。。。我们可能会在完全不同的时区切换到另一台服务器。托管公司不会更改服务器时间以匹配我们的本地时区。(不是我责备他们,而是我试过的一件事。) 那么,我的问题是,存储记录更新的日期/时间的最佳方式是什么,以及将该日期/时间显示回本地时区的用户的最佳方式是什么 我希望以最简单的方式来实现这一点,因此,只

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

那么,我的问题是,存储记录更新的日期/时间的最佳方式是什么,以及将该日期/时间显示回本地时区的用户的最佳方式是什么

我希望以最简单的方式来实现这一点,因此,只要解决方案易于实现,C#和SQL的组合就可以了。(如果有必要的话,我通常的风格是在存储过程中做更多的工作,而在C#中做更少的工作。)


你能给我看一些示例代码吗?谢谢

在数据库中保存UTC时间,并在每次向用户显示时本地化这些时间

将其存储为UTC时间,然后在客户端执行时区计算 在C#中,在DateTime对象上使用.ToUniversalTime()获取UTC时间,将其存储在服务器上,然后使用.ToLocalTime()将其转换回。

始终以协调世界时(UTC也称为GMT)存储日期时间数据。

  • 这避免了所有时区问题
  • 这避免了夏令时问题
  • 这使得简单的日期数学始终有效
  • 这允许不同时区中的事务保持同步
  • 这允许您将数据移动到不同时区的不同服务器上,而不会把一切搞砸
  • 等等,“宇宙”时间,有意义吗
C#DateTime提供DateTime.UtcNow和ToLocalTime(),SQL提供GETUTCDATE()。这里有一个将UTC转换为本地时间的SQL函数-

-- 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

在存储过程中,如果应用程序未提供,请使用GETUTCDATE()而不是GETDATE()。这与我所做的类似,只是我在C#中有自己的ToLocalTime扩展方法。这是因为web服务器位于美国,但我希望泰晤士报显示为澳大利亚泰晤士报。当timzeone偏移量因夏令时而改变时,此功能将失败。@@[Dave Markle]:它应该在夏令时改变时改变!他的意思是,如果你查看日期更改前上周的信息,你会看到今天的偏移量,而不是上周的偏移量。仅当您希望根据今天的偏移量查看本地时间时,此函数才起作用。.Net函数DateTime.ToLocalTime不能以这种方式工作。它将显示基于该日期偏移量的本地时间。