我们有一个调度程序应用程序。使用此应用程序,用户可以安排任务在接下来的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日之后的日期。我应该做些什么改变?
答案 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。 (注意模糊或无效时间的例外情况。)