时区转换和夏令时



我们有一个调度程序应用程序。使用此应用程序,用户可以安排任务在接下来的 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 日夏令时结束时。任务在上午 7 点而不是上午 8 点开始运行,因为计划程序服务始终基于 UTC 运行。

为了解决这个问题,我们需要上述方法为11月1日至11月3日的日期返回下午4 UTC,为11月4日之后的日期返回下午3 UTC。我应该进行哪些更改才能实现此目的?

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

然后您存储太平洋时间上午 8 点,它将转换为下午 3 点或 4 点 UTC,具体取决于它当前是否为 DST。

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

您需要对

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

如果ToUtc的定义类似于:

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

它应该在指定的时间满足 DST。(请注意不明确或无效时间的例外情况。

相关内容

  • 没有找到相关文章

最新更新