如何在时区(UTC到EDT)之间转换时间?

我需要有一个共同的function来将UTC时间转换为EDT。 我在印度有一台服务器。 其中的应用程序需要将EDT时间用于所有时间目的。

我使用的是.NET 3.5。

我在其他论坛上发现了这个。

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId( DateTime.UtcNow, "Eastern Standard Time"); 

当我尝试“Easten Daylight Time”时,我收到了一个错误。

“在本地计算机上找不到时区ID’东部夏令时’”。

请帮助解决此问题或任何其他解决方案。

东部夏令时不是“完整”时区的名称 – 它是时区的“一半”,实际上总是落后于UTC 4小时。 (可能有适当的术语,但我不知道。)

为什么要在没有夏令时的情况下使用EDT? 如果您希望自定义时区始终与UTC具有相同的偏移量,请使用TimeZoneInfo.CreateCustomTimeZone

请注意,如果您使用获取东部标准时区( TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") ),那么仍将适当地应用夏令时(即在夏季)。

例如:

 TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); // Prints True Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 6, 1))); // Prints False Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 1, 1))); 

我会说你应该使用UTC来计算时间段,这样你就可以避免夏令时问题,然后使用LocalTime进行显示。

将UTC的DateTime.ToLocalTime设置为本地时区,然后将DateTime.ToUniversalTime从本地时间转换为UTC。

评论后编辑1

我是否接受了您在显示与服务器不同的时区之后的情况?

如果您正在使用网页访问您的服务器,那么使用HttpRequest.UserLanguages来帮助创建CultureInfo对象并使用它来解析您的DateTime对象。 在此处查看完整说明: Microsoft链接显示网页的本地用户时间。

如果您正在使用客户端 – 服务器体系结构,那么如果LocalTime呼叫位于客户端,它将显示客户端的LocalTime。 然后,您将其转换为UTC以发送回您的服务器。

无论哪种方式,您的服务器都不需要知道客户端在哪里,所以如果您在多个时区中有多个客户端,那么所有计算都将匹配。 它还允许您通过使用不同的Culture对象在任何时区中显示时间。

编辑2复制了我的第二条评论

您可以从服务器获取UTC格式的时间数据。 然后,您可以使用DateTime.ToLocalTime或DateTime.ToUniversalTime将其转换为requried。 如果您还包括日期并且需要应对美国MM / dd / yyyy和欧洲dd / MM / yyyy格式,您可以使用CultureInfo类来相应地解析DateTime值。 这听起来比你现在的工作更多,但这意味着如果你再次移动你的服务器,那么你不需要重新编码DateTime处理。

一个新观点

另一点要看的是服务器和使用NTP(网络时间协议)或SNTP(简单网络时间协议)的客户端之间的时钟同步,如果它足够准确的话。 我不知道您使用的操作系统,但Windows Server时间服务使用它来同步网络。

牛仔方法是采用UTC时间,从中减去四小时的秒数(时区偏移量),使用UTC格式化function对其进行格式化,并在其上打一个“EDT”标签。

如果您需要有时使用夏令时和其他时间使用标准时间,请创建切换日期查找表,或使用某些日历function。