13

我有一个正在编写的 Web 应用程序(C#、MSSQL),当记录存储在系统中时,我需要存储时间戳。通常,我会使用 SQL 和 DATETIME 函数来执行此操作。但是,服务器位于与我们公司所在的时区不同的时区......并且我们可能会更改为完全不同时区的另一台服务器。托管公司不会更改服务器时间以匹配我们当地的时区。(并不是我责怪他们,但这是我尝试过的一件事。)

所以,我的问题是,存储记录更新的日期/时间的最佳方式是什么,以及在我们当地的时区将该日期/时间呈现给用户的最佳方式是什么?

我想要最不混乱的方式,所以只要解决方案易于实施,C# 和 SQL 的组合就可以了。(我的常规风格是在存储过程中做更多的工作,而在 C# 中做更少的工作,如果这很重要的话。)

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

4

3 回答 3

18

始终以协调世界时(UTC 又名 GMT)存储 DATETIME 数据

  • 这避免了所有时区问题
  • 这避免了夏令时问题
  • 这允许简单的日期数学始终有效
  • 这允许不同时区的交易保持同步
  • this allows you to move the data to a different server in a different time zone and not screw everything up
  • etc. "Universal" time, make sense?

C# DateTime provides DateTime.UtcNow and ToLocalTime(), SQL provides GETUTCDATE(). Here's a SQL function to convert UTC to local time -

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

example:

SELECT dbo.udfUtcToLocalTime(someDateTimeField)
FROM someTable
于 2008-10-21T03:42:43.707 回答
7

将 UTC 时间保存在您的数据库中,并在每次您想向用户展示它们时本地化这些时间

于 2008-10-21T00:31:16.310 回答
4

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

于 2008-10-21T00:38:11.427 回答