C# 时区转换和夏令时

C# 时区转换和夏令时,c#,.net,datetime,timezone,dst,C#,.net,Datetime,Timezone,Dst,我们有一个调度程序应用程序。使用此应用程序,用户可以安排在未来30天内每天早上8点运行任务。我们将时间转换为UTC,并将其存储在数据库中,因为我们有来自不同时区的用户。我们使用以下函数将时间转换为UTC: public static DateTime ToAccountLocalTime(this DateTime dt) { return TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("u

我们有一个调度程序应用程序。使用此应用程序,用户可以安排在未来30天内每天早上8点运行任务。我们将时间转换为UTC,并将其存储在数据库中,因为我们有来自不同时区的用户。我们使用以下函数将时间转换为UTC:

public static DateTime ToAccountLocalTime(this DateTime dt)
{
    return TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("user time zone"));
}
现在,如果用户计划在2012年11月1日的未来30天内每天上午8点运行任务,那么在数据库中,30天内的每一天都会有30个条目,时间设置为UTC下午4点(如上所述方法返回)

问题发生在11月4日夏时制结束时。由于调度程序服务始终基于UTC运行,因此任务从早上7点开始运行,而不是早上8点


为了解决这个问题,我们需要使用上述方法返回11月1日至11月3日的下午4点UTC和11月4日之后的下午3点UTC。我应该做哪些更改来实现这一点?

如果本地时间很重要,我会存储本地时间+时区,并在需要UTC时将其转换为UTC

然后存储上午8点,根据当前是否为DST,它将转换为下午3点或4点UTC


您将遇到的问题取决于您的数据库,它可能不支持时区。我可能会存储传递到
FindSystemTimeZoneById
中的字符串。如果你想变得有趣,你可以制作一个表格,列出所有带有标识列的表,并存储Id。

你需要为30天中的每一天进行转换,因此为每个
localDate.AddDays(n)
调用
ToUtc>(或者调用与你在问题中粘贴的例程相反的任何东西),
n
=
1
30
,并存储这些结果

如果
ToUtc
的定义类似于:

return TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("user time zone"));

应在规定的时间满足DST的要求。(请注意不明确或无效时间的例外情况。)

只需看一下针对ConvertTimeFromUtc的MSDN库文章。注意它是如何使用iSayLaySaveItTimeTime()的。你应该考虑到日光节约在全球范围内没有得到同样的应用。我发现清单列出了夏令时的一些应用方式。把你的时间存储在UTC会使时间标准化,但我认为你不能把日光节约标准化。考虑一下野田佳彦的时间:@汉斯潘我找不到这篇文章。你能提供一个链接吗?@Francois我知道这一点,因此我想知道解决这个问题的正确方法是什么