Mar*_*ino 2 c# timezone datetime datetimeoffset datetime-format
我有一个生成vCal和iCal文件的页面,可以将事件导入Outlook和iCal.这些邮件客户端(Outlook和iCal)将接收UTC中的日期,因为他们知道用户的偏移量并将处理正确的时间.我们编写此代码的客户端基于美国东部时区,我也是.我们的主机位于中部时区(距离东部1小时).我想让代码处理这个没有任何硬编码的偏移量.我的代码目前从我们的CMS获得DateTime并转换为UTC for Outlook/iCal.这意味着CMS的DateTime值相对于托管位置:
// Start Date Time
sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));
Run Code Online (Sandbox Code Playgroud)
当我在本地运行时,一切都很好,因为CMS中的DateTime基于我们客户端的东部时区,所以我是,所以进程是东部 - > UTC - >进入Outlook然后进入UTC - >东部一切都很好.当我在Central中部署到服务器时,来自CMS的DateTime距离Eastern一小时.如何在转换为UTC之前自动从东方获取偏移并添加它?我显然需要这个来处理标准时间(EST)和日光时间(EDT).我想以编程方式执行它而不使用硬编码值,因此无论您处于什么时区,它都能正常工作.即如果我将此代码交给某人在印度进行开发,它应该自动处理其本地服务器的偏移量和相应调整.
我需要做这样的事情,我在转换为UTC之前将偏移应用到东部时间:
sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ApplyEasternOffset().ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果这是之前讨论过的主题,我只是不确定找到这样的问题的最佳条款.提前致谢.
您可以使用TimeZoneInfo类.
看一下这个样本:
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
TimeSpan offset = tzi.GetUtcOffset(DateTime.Now);
DateTime testDateTime = DateTime.Now.Add(offset);
Run Code Online (Sandbox Code Playgroud)
查看TimeZoneInfo类.它具有获取任何时区的UTC偏移的方法.
http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx
另外,请查看以前的帖子:如何使用TimeZoneInfo在夏令时期间获取当地时间?
这是一个显示从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));
Run Code Online (Sandbox Code Playgroud)
当我的本地时钟显示9:05:31时显示4/4/2011 12:05:31.