【问题标题】:Problem to get report from SQL Server timer从 SQL Server 计时器获取报告的问题
【发布时间】:2019-07-21 23:52:14
【问题描述】:

我们经常遇到的一个问题是如何更改服务器时间,使其与客户或用户的时区相匹配。不幸的是,答案是——你不能。 Web 服务器只能在一个时区运行,因此其他 39 个时区的时间将“关闭”。

解决此问题的方法是将服务器时间转换为本地时间。 .NET 使用内置的 TimeZoneInfo 类使这一过程变得简单,该类可用于将一个时区转换为另一个时区。

那么我的服务器时间将与我的本地时间相差 12.30 小时,即从我的本地时间减去 12 小时 30 分钟以获得我的服务器时间。我需要从服务器时间获取我的本地时间。如何实现?

我尝试上课:

protected DateTime GetCurrentTime()
{
        DateTime serverTime = DateTime.Now;
        DateTime _localTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(serverTime, TimeZoneInfo.Local.Id, "Arab Standard Time");
        return _localTime;
}

这是在服务器上获取 TimeZoneId 的方法:

protected void Page_Load(object sender, EventArgs e)
{
       foreach (TimeZoneInfo zoneID in TimeZoneInfo.GetSystemTimeZones())
        {
            Response.Write(zoneID.Id + "<br/>");
        }
}

但我不知道我做错了什么或者为什么这样做有什么好处。我所拥有的只是服务器上的一个数据库并与 c# windows 应用程序连接,我尝试使用此代码获取我今天的报告&gt; DATEADD(d, - 1, GETDATE()),但它在上午 11:30 之后工作

【问题讨论】:

    标签: c# sql-server datetime timezone hosting


    【解决方案1】:

    您不应该编写关心服务器时区的代码。相反,编写适用于 UTC 时间和特定时区的代码。

    你的 C# 代码应该是这样的:

    DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Arab Standard Time");
    

    对于 SQL,通常您应该记录基于 UTC 的值,在这种情况下根本不需要转换。但是,如果您因为存储本地值而需要转换,则可以使用系统当前的 UTC 时间和 AT TIME ZONE 函数,如下所示:

    WHERE dt > (DATEADD(d, -1, GETUTCDATE() AT TIME ZONE 'Arab Standard Time')
    

    在这两种情况下,最好时区标识符'Arab Standard Time' 来自变量,而不是硬编码。

    【讨论】:

    • 第一个代码对我来说很好用,但第二个代码我不能在 sql server 中工作
    • 您运行的是什么版本的 SQL Server?
    【解决方案2】:

    SQL Server 系统的本地时区与用于对记录数据进行时间戳记的时区之间似乎存在差异。我建议检查最新记录的数据并将其与 SQL 服务器系统的本地时间进行比较;这应该会揭示出这样的差异。

    例如,如果记录的数据以 UTC 为时间戳,那么您可以检索 DATEADD(d, -1, GETUTCDATE()) 和 GETUTCDATE() 之间时间范围内的最后 24 小时数据。请注意,这并不一定会为您提供当地时间午夜到午夜的报告;为此,您必须首先计算本地午夜到午夜时间的 UTC 时间范围,然后查询计算出的 UTC 时间范围。

    【讨论】:

    • 相信我知道这是最好的方法,因为我是编码新手,我认为我现在很难计算它并以写入方式进行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多