【问题标题】:Change timezone in C#在 C# 中更改时区
【发布时间】:2011-04-02 14:13:43
【问题描述】:

我有一个日期格式,类似于:

格林威治标准时间 2010 年 8 月 22 日星期一、星期日 12:38:33

如何将其转换为 EST 格式?

注意:我知道可以使用 TimeZoneinfo 来实现,但这是在 3.5 中引入的,我想使用 2.0 或任何旧版本。

【问题讨论】:

  • 您是在时区时间之后(美国东部标准时间 7:38:33)还是更改日期格式(08/22/2010)?
  • 抱歉,如果不使用 3.5 或设计自己的解码当前时区然后减去它,这是不可能的。
  • 好的,总结一下我们在根据时区转换时间之后,例如格林威治标准时间 1100 至东部标准时间 0600。还有一些问题:这只是为了向用户显示时间吗?我们是否需要考虑夏令时调整和历史时间,例如格林威治标准时间 1100 可以是夏令时的东部标准时间 0700,但是如果夏令时不适用时是格林威治标准时间 1100 怎么办?哦,它需要在 Net 2.0 或 1.1 上运行。

标签: c# datetime formatting timezone


【解决方案1】:

EST 可能不是一种格式,而是时区的缩写。 IE。 “手动”方式是解析上述日期并减去时区差异。您应该注意夏令时时间段,即您需要检查上述时间是否适合 DST 时间段。

【讨论】:

    【解决方案2】:

    我猜你必须走理解时区的老路。你的例子虽然很简单。

    GMT 是夏令时更改的 UTC。
    EST 是夏令时更改的 UTC -5 小时。

    因此,您只需减去 5 小时即可获得 EST 时间。

    【讨论】:

    • 实际上 GMT 不是夏令时的 UTC。你会发现 UTC 和 GMT 是一样的。目前英国是 GMT+1(英国夏令时间)。
    • @Chris - Pff,这越来越令人困惑了......我根据我所说的 Windows 7 中的时区列表,你可以看到这里列出的一个,例如:riotingbits.com/2009/… - 和该列表 GMT 被定义为具有夏令时更改的 UTC。现在,我不知道不同媒体的时区定义有多一致......
    • 我刚刚使用 .NET 3.5 进行了一些代码测试,首先将 DateTime.UtcNow 转换为“东部标准时间”,然后转换为“GMT 标准时间”,我确实得到了 5 小时的差异。但你是对的,克里斯,GMT通常与 UTC 相同 - 似乎 Windows(至少 Win 7)对待它的方式不同。
    • 您还应该提到,在 2007 年,根据 [2005 年能源政策法案],美国将夏令时双向延长了大约 2 周,这意味着美国东部标准时间之间的时差格林威治标准时间一年中大约有 4 周为 -4 小时。这不再像 -5 小时那么简单。
    【解决方案3】:

    最简单的方法可能是像这样休息 5 个小时。

    DateTime dateTime = DateTime.UtcNow;
    dateTime.AddHours(-5);
    

    但这不会考虑夏令时等。但你总是可以为这种可能性编写代码。

    【讨论】:

      【解决方案4】:

      对于 Net 2.0 和 1.1,您可以使用 TimeZone 类,该类现已被 TimeZoneInfo 类取代。

      在进一步研究后编辑 看起来,在 NET 3.5 之前,所有可用的都是 TimeZone 类。 无法计算本地时区和 UTC 以外的时区的 TimeDate 值。因此,如果您希望将时间计算为 EST 或 PST 并且您位于英国,那么事情会变得有些困难。

      这是一个使用 TimeZone 的简短演示程序(它来自一个基本的控制台应用程序。:

      class Program
      {
          static void Main(string[] args)
          {
              DateTime time = DateTime.UtcNow;
              Console.WriteLine(string.Format("UTC time is {0}", time.ToShortTimeString()));
      
              TimeZone zone = TimeZone.CurrentTimeZone;
      
              //The following line depends on a call to TimeZone.GetUtcOffset for NET 1.0 and 1.1
              DateTime workingTime = zone.ToLocalTime(time);
              DisplayTime(workingTime, zone);
              IFormatProvider culture = new System.Globalization.CultureInfo("en-GB", true);
              workingTime = DateTime.Parse("22/2/2010 12:15:32");
      
              Console.WriteLine();
              Console.WriteLine(string.Format("Historical Date Time is : {0}",workingTime.ToString()));
              DisplayTime(workingTime, zone);
              Console.WriteLine("Press any key to close ...");
              Console.ReadLine();
          }
          static void DisplayTime(DateTime time, TimeZone zone)
          {
              Console.WriteLine(string.Format("Current time zone is {0}", zone.StandardName));
              Console.WriteLine(string.Format("Does this time include Daylight saving? - {0}", zone.IsDaylightSavingTime(time) ? "Yes" : "No"));
              if (zone.IsDaylightSavingTime(time))
              {
                  Console.WriteLine(string.Format("So this time locally is {0} {1}", time.ToShortTimeString(), zone.DaylightName));
              }
              else
              {
                  Console.WriteLine(string.Format("So this time locally is {0} {1}", time.ToShortTimeString(), zone.StandardName));
              }
              Console.WriteLine(string.Format("Time offset from UTC is {0} hours.", zone.GetUtcOffset(time)));
      
          }
      }
      

      如您所见,它只处理当地时间和 UTC。

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-21
        • 2012-02-08
        • 2019-02-19
        • 2020-02-29
        相关资源
        最近更新 更多