时区转换和夏令时

时间:2012-11-12 13:35:39

标签: c# .net datetime timezone dst

我们有一个调度程序应用程序。使用此应用程序,用户可以安排任务在接下来的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点运行,那么在数据库中30个条目的30个日期中的每一个都设置为时间设置为下午4点(如返回通过上述方法)。

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

为了解决这个问题,我们需要上述方法返回11月1日至11月3日和11月4日UTC之后的4 PM UTC日期。11月4日之后的日期。我应该做些什么改变?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您需要为30天中的每一天进行转换,因此请为ToUtc中的每一个致电localDate.AddDays(n)(或与您在问题中粘贴的例程相反的任何内容) },n = 1 .. 30,并存储这些结果。

如果ToUtc的定义类似于:

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

它应该在指定的时间满足DST。 (注意模糊或无效时间的例外情况。)