UTC到用户的当地时间

时间:2010-08-09 11:20:37

标签: c# timezone

我正在创建一个Web应用程序,它将显示应用程序中发生的各种事件的日期(例如,正在生成的文档)。当然,显示的日期需要考虑用户所在的位置(而不是盲目输出存储的日期,因为这将是服务器本地时间)。

我已经制作了一个列出所有时区的示例应用程序,让您选择一个,然后在您选择的时区输出一些存储的UTC日期,在时区观察夏令时时增加一小时。

我的问题是:这是一种最佳方法和/或我是否错过了某种方法,这种方法在所有情况下都不起作用?

static void Main(string[] args)
{
 List<DateTime> events = new List<DateTime>();

 events.Add(DateTime.UtcNow);
 events.Add(DateTime.UtcNow.AddDays(1));
 events.Add(DateTime.UtcNow.AddDays(7));

    var timeZones = TimeZoneInfo.GetSystemTimeZones();

 for (var i = 0; i < timeZones.Count; i++)
 {
  Console.WriteLine(i + " : " + timeZones[i].DisplayName);
 }

 var currentZone = timeZones[Convert.ToInt32(Console.ReadLine())];

 Console.WriteLine("UTC Event: {0}", events[0]);
 Console.WriteLine("Local Event: {0}", correct(events[0], currentZone));

 Console.ReadKey();
}

static DateTime correct(DateTime date, TimeZoneInfo timeZone)
{
 var correctedDate = date.AddHours(timeZone.BaseUtcOffset.TotalHours);

 if (timeZone.IsDaylightSavingTime(date))
 {
  return correctedDate.AddHours(1);
 }

 return correctedDate;
}

我从输出中得到了我期望的结果,我只关心时区的复杂问题不能这么简单地解决。

1 个答案:

答案 0 :(得分:1)

这比那简单得多:)

使用TimeZoneInfo.ConvertTimeFromUtc - 您不需要自己处理偏移量:)(特别是,您当前的代码假设DST相差一个小时,这并不总是正确的。)

您可能希望使用DateTimeOffset来避免在UTC时不会想到某些内容。