2

我有一个生成 vCal 和 iCal 文件以将事件导入 Outlook 和 iCal 的页面。这些邮件客户端(Outlook 和 iCal)将采用 UTC 日期,因为它们知道用户的偏移量并会处理正确的时间。我们正在为其编写此代码的客户位于美国东部时区之外,我也是。他们的主机位于中部时区(比东部时区晚 1 小时)。我想让代码在没有任何硬编码偏移的情况下处理这个问题。我的代码目前从我们的 CMS 获取 DateTime 并转换为 Outlook/iCal 的 UTC。这意味着来自 CMS 的 DateTime 值是相对于托管位置的:

// Start Date Time
sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

当我在本地运行它时,一切都很好,因为 CMS 中的 DateTime 基于我们客户的东部时区,我也是,所以过程是东部 -> UTC -> 进入 Outlook,然后进入 UTC -> 东部,一切都很好。当我部署到 Central 的服务器时,CMS 的 DateTime 比东部时间差一个小时。在转换为 UTC 之前,如何自动获取东部的偏移量并将其添加?我显然需要它来处理标准时间(EST)和日光时间(EDT)。我想在没有硬编码值的情况下以编程方式进行操作,因此无论您在哪个时区,它始终可以正常工作。即,如果我将此代码交付给在印度进行开发的某人,它应该自动处理他们本地服务器的偏移量和相应地调整。

我需要做这样的事情,在转换为 UTC 之前对东部时间应用偏移量:

sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ApplyEasternOffset().ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

抱歉,如果这是以前讨论过的主题,我只是不确定找到此类问题的最佳术语。提前致谢。

4

2 回答 2

7

查看 TimeZoneInfo 类。它具有获取任何时区的 UTC 偏移量的方法。

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

另外,请查看上一篇文章:如何在夏令时使用 TimeZoneInfo 获取本地时间?

这是一个显示从太平洋到东部转换的示例:

var eastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var local = TimeZoneInfo.Local; // PDT for me
Console.WriteLine(DateTime.Now.Add(eastern.BaseUtcOffset - local.BaseUtcOffset));

当我的本地时钟显示 9:05:31 时,显示 4/4/2011 12:05:31。

于 2011-04-04T15:44:01.073 回答
6

您可以使用TimeZoneInfo类。

看看这个样本:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
TimeSpan offset = tzi.GetUtcOffset(DateTime.Now);

DateTime testDateTime = DateTime.Now.Add(offset);
于 2011-04-04T15:42:33.057 回答