gpt4 book ai didi

c# - TimeZoneInfo 在两位代码中的工作方式不同

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:17 28 4
gpt4 key购买 nike

我的 UI 层中有一些代码,应该采用 UTC 格式的 DateTime,并将其转换为本地日期时间:

在我的数据层中,我只是这样做:

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 是否已设置。如果不是,则从user表中获取zimezone,然后进行转换。

此代码有效,我得到了有效结果。

然后我将代码复制到我的 UI 层(因为我也需要在那里为数据网格进行转换),但“回复”始终等于“dt”。

我用谷歌搜索,发现我应该以稍微不同的方式来做。所以我将我的 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 中,我需要更改代码。

我在其中一种方法中的时间转换代码有问题吗?

最佳答案

如果我对您的理解正确,您的问题归结为 ConvertTimeBySystemTimeZoneId 之间的区别和 ConvertTimeFromUtc .

首先,您需要了解任何涉及DateTime的时区转换操作。根据 .Kind 的值可能会有行为差异的 DateTime你在给它。当您查看每种方法(herehere)的文档时,您会发现一个图表,其中描述了三种不同类型(UtcLocalUnspecified)中每一种的行为。 ).

这是 .Net 中的痛点,这就是为什么像 Noda Time 这样的库存在。您可以在这两篇文章中阅读更多内容:

具体问题的实际原因是您可能传入了 DateTime谁是.KindUnspecified .在ConvertTimeBySystemTimeZoneId方法,它将被视为 Local , 而在 ConvertTimeFromUtc方法它将被视为 Utc .

有两种解决方案。

  • 第一个是您已经找到的 - 使用 ConvertTimeFromUtc方法。您也应该在服务器代码中执行此操作。

  • 第二种解决方案是设置 .KindUtc当您从数据库加载值时。某处你可能有这样的代码:

    foo.MyDateTime = (DateTime) dataReader["MyDateTime"]

    这将更改为:

    foo.MyDateTime = DateTime.SpecifyKind(
    (DateTime) dataReader["MyDateTime"],
    DateTimeKind.Utc);

我假设您正在使用 DataReader 直接调用 ADO.Net回复。无论您实际做什么,都要相应地进行调整。

关于c# - TimeZoneInfo 在两位代码中的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18286173/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com