您可以获得时区列表System.TimeZoneInfo
.
var timeZones = System.TimeZoneInfo.GetSystemTimeZones();
foreach ( var timeZone in timeZones )
{
Console.WriteLine( "{0} - {1}", timeZone.Id, timeZone.DisplayName );
}
您可以使用该列表填充用户个人资料页面上的下拉列表。所选值应与每个用户的配置文件数据一起存储。
然后,您可以使用 TimeZoneInfo.ConvertTime 将任何日期时间转换为用户时区。假设您知道它是在哪个时区创建的。
var now = DateTime.Now;
Console.WriteLine( now );
Console.WriteLine( System.TimeZoneInfo.ConvertTime( now, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById( "China Standard Time" ) ) );
至于在哪里进行此转换,您可以在控制器中而不是视图中进行。您最好的选择是在进行转换的主题之上创建一个视图模型。
否则,创建一个辅助函数来进行转换,可以从您的视图访问并正确使用它。就我个人而言,我不会害怕在视图中这样做。
厌倦了尝试在数据库中进行转换,您将严重限制对从数据库返回的数据执行对象缓存的能力。
另外,在将所有日期插入数据库之前,请考虑将它们转换为 UTC 时间。这将使排序正确(就夏令时而言),并且还限制了托管环境移动时区或跨时区托管时可能出现的任何问题。