将DateTime偏移应用于US Eastern Timezone

时间:2011-04-04 15:29:18

标签: c# datetime timezone datetime-format datetimeoffset

我有一个生成vCal和iCal文件的页面,可以将事件导入Outlook和iCal。这些邮件客户端(Outlook& iCal)将接收UTC中的日期,因为他们知道用户的偏移量并将处理正确的时间。我们编写此代码的客户端基于美国东部时区,因此我是I.他们的主机位于中部时区(距离东部1小时)。我想让代码处理这个没有任何硬编码的偏移量。我的代码目前从我们的CMS获得DateTime并转换为UTC for Outlook / iCal。这意味着CMS的DateTime值相对于托管位置:

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

当我在我的本地运行时,一切都很好,因为CMS中的DateTime基于我们客户的东部时区,我也是,所以这个过程是东部的 - > UTC - >进入Outlook然后进入UTC - >东方,一切都很好。当我在Central中部署到服务器时,来自CMS的DateTime距离Eastern一小时。如何在转换为UTC之前自动从东方获取偏移并添加它?我显然需要这个来处理标准时间(EST)和日光时间(EDT)。我想以编程方式执行它而不使用硬编码值,因此无论您处于什么时区,它都能正常工作.I.e。如果我将此代码交给某人在印度进行开发,它应自动处理其本地服务器的偏移量并相应调整。

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

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

很抱歉,如果这是之前讨论过的主题,我只是不确定找到这样的问题的最佳条款。提前谢谢。

2 个答案:

答案 0 :(得分:6)

您可以使用TimeZoneInfo Class。

看一下这个样本:

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

DateTime testDateTime = DateTime.Now.Add(offset);

答案 1 :(得分:6)

查看TimeZoneInfo类。它有方法可以获得任何时区的UTC偏移量。

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

另外,请查看以前的帖子:How to use TimeZoneInfo to get local time during Daylight Savings Time?

以下是一个显示从Pacfic到Eastern的转换的示例:

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。

相关问题