1
var Result1 = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local)

var Result2 = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,  TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id));

这两者都将 Utc 时间转换为本地时间,这两种不同的结果或性能方式之间有什么区别吗?

哪个好?

为什么微软不在示例中直接使用 TimeZoneInfo.Local(至于 Result1

4

4 回答 4

1

唯一的区别是第二个绕道而行,获取一个TimeZoneInfo对象,获取它的 id,然后使用 id 再次查找相同的对象。

示例中的代码使用该FindSystemTimeZoneById方法的原因是它正在获取TimeZoneInfo已知 id 的对象,而不是从TimeZoneInfo它已经拥有的对象中获取该 id。

于 2013-05-29T08:44:18.333 回答
0

我认为将我的评论扩展到答案可能是值得的。

我有一个应用程序,其中在数据库中配置了“本地”时区,它与服务器本身的本地时区无关。(它在云服务器中运行)。因此,使用TimeZoneInfo.Local对我不利。

我想做的是从数据库中读取应该使用哪个时区,然后将时间从 UTC 转换为该时区。因此我使用:

TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,  TimeZoneInfo.FindSystemTimeZoneById(GetTimeZoneId()));

GetTimeZoneId ()从数据库读取的位置。

于 2013-05-29T08:42:06.557 回答
0

这是你将如何使用它们的问题。TimeZoneInfo.FindSystemTimeZoneById()当您想要一个不同于本地的时区时使用。如果您总是要使用本地时区,只需使用TimeZoneInfo.Local

在性能方面,我认为差别不大。但是,您可以尝试使用 .NET Profiler 或其他分析器对其进行分析,以查看两者有多大差异。

于 2013-05-29T08:42:33.073 回答
0

是的,这两个调用之间存在差异。

Windows 具有自动调整 DST 的功能,这可以在现代 Windows 的两个地方看到:

在日期和时间设置页面中: 截屏

在时区设置下的日期和时间控制面板中: 截屏

在大多数情况下,建议将此设置保持为 ON。但是,如果您将其关闭TimeZoneInfo.Local则会考虑到这一点。

如果您调用TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id),结果将与设置打开时相同,即使它实际上已关闭。这是设计使然。

于 2021-01-07T23:07:07.827 回答