两位我有我的UI层,这是应该采取一个DateTime,这是UTC一些代码,并将其转换为本地日期时间:的TimeZoneInfo的工作方式不同的代码
在我的数据层,我只是这样做:
private DateTime ConvertToLocal(DateTime dt)
{
if (_currentTimeZoneUser == string.Empty)
{
var u = new UserData(_userId).GetUser(_userId);
_currentTimeZoneUser = u.TimeZoneId;
}
var reply = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, _currentTimeZoneUser);
return reply;
}
这样做是检查是否设置_currentTimeZoneUser。如果没有,从用户表中获取zimezone,然后进行转换。
此代码正在工作,并且我得到一个有效的结果。
然后我将代码复制到我的UI层(因为我还需要为数据网格进行转换),但'回复'总是等于'dt'。
我用Google搜索了一下,发现我应该以一种稍微不同的方式做。所以我改变我的UI方法为:
public static DateTime GetLocalDateTime(DateTime serverTime)
{
var timeZoneId = HttpContext.Current.Session["TimeZoneId"].ToString();
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var reply = TimeZoneInfo.ConvertTimeFromUtc(serverTime, cstZone);
return reply;
}
它的工作原理!
我看不出为什么它在我的数据层中工作,但在UI中,我需要更改代码。
我是否在我的时间转换代码中的一种方法做错了什么?
这完全是错误的。当你使用HttpContext时,那些对当地时间感兴趣的* only *实体就是用户,几千英里的距离以及从你的Web服务器中删除的无法估量的时区数量。在服务器端严格使用UTC,在浏览器中转换为本地时间。 –
@HansPassant - 这需要JavaScript,这并不总是可能的,并且在这方面有错误[在转换过去的日期时](http://codeofmatt.com/2013/06/07/javascript-date-type-is-可怕破碎/)。在服务器端代码中进行时区转换没有任何问题,只要您知道用户的时区标识,他就可以。 –