代码之家  ›  专栏  ›  技术社区  ›  Shetty

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

  •  10
  • Shetty  · 技术社区  · 15 年前

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

    我正在使用.NET 3.5。

    我在其他论坛上找到这个。

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

    当我尝试“东方夏令时”时,我出错了。

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

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

    3 回复  |  直到 15 年前
        1
  •  23
  •   Jon Skeet    15 年前

    东部夏令时不是一个“完整”时区的名称——它是一个“半”时区,实际上,总是比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)));
    
        2
  •  1
  •   ChrisBD    15 年前

    我会说,您应该使用UTC来计算时间段,这样可以避免日光节约时间的问题,然后只使用本地时间进行显示。

    datetime.tolocaletime for utc to whatever the local time zone is and then datetime.touniversaletime to convert from local time to utc.

    评论1后编辑

    那么,我是否认为您显示的时区与服务器的时区不同?

    如果您正在使用网页访问服务器,请使用 httpRequest.userLanguages帮助创建CultureInfo对象,并使用该对象分析日期时间对象。 请在此处查找完整的解释: Microsoft link on displaying local user time for web pages.

    如果您使用的是客户机-服务器体系结构,那么如果本地时间调用在客户机端,它将显示客户机的本地时间。然后将其转换为UTC以发送回服务器。

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

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

    您可以从服务器获取UTC格式的时间数据。然后您可以使用datetime.tolocaltime或datetime.touniversaltime进行转换。如果还包括日期,并且需要处理例如US mm/dd/yyyy和欧洲dd/mm/yyyy格式,则可以使用CultureInfo类相应地分析日期时间值。这听起来比目前的工作要多,但这意味着如果您再次移动服务器,就不需要重新编码日期时间处理。

    一个新的观点

    另一个需要考虑的问题是,如果服务器和客户机之间的时钟同步足够精确,那么可以使用ntp(网络时间协议)或sntp(简单网络时间协议)。我不知道您使用的是什么操作系统,但Windows Server Time Services使用它来同步网络。

        3
  •  0
  •   Robert L    15 年前

    牛仔方法是利用UTC时间,从中减去4小时的秒数(时区偏移量),使用UTC格式函数对其进行格式设置,并在其上加上“edt”标签。

    如果您有时需要使用夏令时,而有时需要使用标准时间,那么可以创建切换日期的查阅表,或者使用一些日历功能。