我们一直得到的一个问题是如何更改服务器时间以使其与客户或用户的时区相匹配。不幸的是,答案是 - 你做不到。 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应用程序连接,我尝试使用此代码获取我今天的报告> DATEADD(d, - 1, GETDATE())
但它在上午11:30之后工作
您不应该编写关心服务器时区的代码。而是编写适用于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服务器系统的本地时区与用于为记录数据添加时间戳的时区之间似乎存在差异。我建议检查最新记录的数据,并将其与SQL服务器系统的本地时间进行比较;这应该揭示出这样的差异。
例如,如果记录的数据以UTC标记时间,那么您可以在DATEADD(d,-1,GETUTCDATE())和GETUTCDATE()之间的时间范围内检索最近24小时的数据。请注意,这并不一定会为您提供当地时间的午夜到午夜报告;为此,您必须首先计算从当地午夜到午夜时间的UTC时间范围,然后查询计算的UTC时间范围。