2010-08-09 69 views
0

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

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

我的问题是:这是一个最佳的方法和/或我错过了什么地方通过这种方法将无法在所有情况下工作?

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

这比:)

使用TimeZoneInfo.ConvertTimeFromUtc简单得多 - 你不需要惹偏移自己:)(特别是,当前的代码假定整整一个小时的DST差异,这ISN各地” t总是正确的。)

您可能希望使用DateTimeOffset以避免在UTC时间内不考虑UTC。

+0

非常好,非常感谢。没有比删除代码更令人满意的了(尤其是那些有缺陷的):) – Martin 2010-08-09 11:43:22