C# 将日期时间偏移应用于美国东部时区

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

我有一个生成vCal和iCal文件的页面,用于将事件导入Outlook和iCal。这些邮件客户端(Outlook和iCal)将以UTC为单位接收日期,因为它们知道用户的偏移量,并将处理输入正确时间的问题。我们正在为其编写此代码的客户来自美国东部时区,我也是。他们的主机位于中部时区(比东部时区晚1小时)。我想让代码在没有任何硬编码偏移的情况下处理这个问题。我的代码当前从CMS获取日期时间,并转换为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与Eastern相隔一小时。在转换为UTC之前,如何自动获取与东部的偏移并将其添加?我显然需要这个来处理标准时间(EST)和夏时制(EDT)。我想做它的编程没有硬编码的值,所以它总是正确的工作,无论你在哪个时区。也就是说,如果我将此代码交付给印度的开发人员,它将自动处理其本地服务器的偏移量,并进行相应调整

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

sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ApplyEasternOffset().ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));
抱歉,如果这是一个以前讨论过的话题,我只是不确定找到这样一个问题的最佳术语。提前感谢。

您可以使用课堂

看看这个示例:

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

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

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

另外,请查看之前的帖子:

下面是一个示例,显示了从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时,显示为2011年4月4日12:05:31。

此问题始于服务器生成本地时间戳而不是UTC。在很长一段时间内,这将是一个让你头疼的问题,你必须猜测服务器的位置,直到你解决这个问题。这帮助我解决了这个问题。事实证明,我需要在转换为UTC后添加东部偏移量,因为
ToUniversalTime()
方法已经从本地TZ处理了它。所以我把它改为:
TimeSpan easternfset=TimeZoneInfo.Local.BaseUtcOffset-easternTZ.BaseUtcOffset
thisEvent.StartDate.ToUniversalTime().Add(EasternCoffset)