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

时间:2009-06-08 13:21:29

标签: c# timezone

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

我使用的是.NET 3.5。

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

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

当我尝试使用“Easten Daylight Time”时出现错误。

  

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

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

4 个答案:

答案 0 :(得分:24)

Eastern Daylight Time不是“完整”时区的名称 - 它是时区的“一半”,实际上总是落后于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)));

答案 1 :(得分:1)

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

UTC的DateTime.ToLocalTime,无论本地时区是什么,然后是DateTime.ToUniversalTime,从本地时间转换为UTC。

在评论1后修改

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

如果您使用网页访问您的服务器,请使用 HttpRequest.UserLanguages帮助创建CultureInfo对象并使用它来解析DateTime对象。 请在此处查看完整说明:Microsoft link on displaying local user time for web pages.

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

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

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

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

新点

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

TimeZoneInfo.ConvertTimeFromUtc将具有正确的偏移量,具体取决于您提供的DateTime。例如:

格林尼治标准时间3AM UTC / 11PM(偏移4小时):

DateTime timeSummerET = TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime("08/01/2019 03:00:00"), zoneET);

3AM UTC / 10PM ET(5小时偏移):

DateTime timeWinterET = TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime("12/01/2019 03:00:00"), zoneET);