TimeZoneInfo.ConvertTimeFromUtc c#

时间:2013-05-29 08:31:16

标签: c# .net datetime timezone

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

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

这会将Utc时间转换为本地时间,这两种不同的结果或表现方式有什么不同吗?

哪个好?

为什么Microsoft不在样本here中直接使用TimeZoneInfo.Local(对于Result1)

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

我想要的是从DB读取应该使用的时区, 然后将时间从UTC转换为该时区。 因此我正在使用:

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

GetTimeZoneId()从数据库读取。

答案 2 :(得分:0)

这是你将如何使用它们的问题。如果您需要本地以外的其他时区,则使用 TimeZoneInfo.FindSystemTimeZoneById()。如果您总是要使用当地时区,请使用 TimeZoneInfo.Local

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

答案 3 :(得分:0)

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

Windows 具有自动调整夏令时的功能,在现代 Windows 上可以在两个地方看到:

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

在“时区设置”下的“日期和时间”控制面板中: screenshot

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

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