c# - 时区转换和夏令时

标签 c# .net datetime timezone dst

我们有一个调度程序应用程序。使用此应用程序,用户可以安排任务在接下来的 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 个条目,时间设置为世界标准时间下午 4 点(返回时)通过上述方法)。

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

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

最佳答案

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

然后您存储 8AM PT,它会转换为 3 点或 4 PM UTC,具体取决于当前是否为夏令时。

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

关于c# - 时区转换和夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344693/

相关文章:

datetime - 如何在批处理文件中使用变量 %TIME :~0, 2% 以便带有前导空格的时间不会导致错误?

php - MySQL 中看似不正确的时区转换(UTC 到 PST)

c# - 如何从 FileStream 报告进度

.net - 在 .NET 中使用私钥对文件进行签名

c# - "??"是什么意思?

c# - 验证当前运行的可执行文件

c# - 泛型如何实现结构?

javascript - 时差并在javascript中转换为小时和分钟

javascript - 从 JsonResult 返回字符串数组并在 JavaScript 中使用它

c# 退格模拟器 - 删除整个单词而不仅仅是一个字母?