我正在创建一个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;
}
我从输出中得到了我期望的结果,我只关心时区的复杂问题不能这么简单地解决。
答案 0 :(得分:1)
这比那简单得多:)
使用TimeZoneInfo.ConvertTimeFromUtc
- 您不需要自己处理偏移量:)(特别是,您当前的代码假设DST相差一个小时,这并不总是正确的。)
您可能希望使用DateTimeOffset
来避免在UTC时不会想到某些内容。