首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从SQL Server计时器获取报告时出现问题

从SQL Server计时器获取报告时出现问题
EN

Stack Overflow用户
提问于 2019-02-28 14:04:10
回答 2查看 65关注 0票数 0

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

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

那么我的服务器时间将与我的本地时间相差12.30小时,即从我的本地时间减去12小时30分钟得到我的服务器时间。我需要从服务器时间中获取我的本地时间。怎样才能实现呢?

我试着上一节课:

代码语言:javascript
复制
protected DateTime GetCurrentTime()
{
        DateTime serverTime = DateTime.Now;
        DateTime _localTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(serverTime, TimeZoneInfo.Local.Id, "Arab Standard Time");
        return _localTime;
}

下面是如何在服务器上获取TimeZoneId的方法:

代码语言:javascript
复制
protected void Page_Load(object sender, EventArgs e)
{
       foreach (TimeZoneInfo zoneID in TimeZoneInfo.GetSystemTimeZones())
        {
            Response.Write(zoneID.Id + "<br/>");
        }
}

但我不知道我做错了什么,也不知道为什么要这么做。我只有一个数据库在服务器上,并与c# windows应用程序连接,我尝试以下代码来获得我今天的报告> DATEADD(d, - 1, GETDATE()),但它在上午11:30后工作

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-01 04:00:26

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

您的C#代码应该如下所示:

代码语言:javascript
复制
DateTime dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "Arab Standard Time");

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

代码语言:javascript
复制
WHERE dt > (DATEADD(d, -1, GETUTCDATE() AT TIME ZONE 'Arab Standard Time')

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

票数 0
EN

Stack Overflow用户

发布于 2019-03-01 03:20:29

SQL server系统的本地时区与用于为记录的数据添加时间戳的时区之间似乎存在差异。我建议检查最新记录的数据,并将其与SQL server系统的本地时间进行比较;这应该会显示出这样的差异。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54919358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档