繁体   English   中英

时区转换和夏令时

[英]Timezone conversion and daylight saving

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

public static DateTime ToAccountLocalTime(this DateTime dt)
{
    return TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("user time zone"));
}

现在,如果用户计划在2012年11月1日的下一个30天每天上午8点在PT上运行任务,那么在数据库中,30天中的每一天都会生成条目,时间设置为UTC时间下午4点(如上所述)方法)。

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

为了解决这个问题,我们需要上述方法在11月4日之后的11月1日至11月3日和晚上3点之间返回4 PM UTC。我应该做些什么改变来实现这一目标?

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

然后存储8AM PT,它将转换为3或4 PM UTC,具体取决于它当前是否为DST。

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

您需要为30天中的每一天进行转换,因此请为每个localDate.AddDays(n)调用ToUtc (或调用您在问题中粘贴的例程的相反方向localDate.AddDays(n)n = 1 .. 30 ,并存储这些结果。

如果ToUtc定义类似于:

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

它应该在规定的时间迎合夏令时。 (注意模糊或无效时间的例外情况。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM