我的问题是双重的. 1)我正在编写一个论坛,我无法弄清楚如何为论坛用户存储时区.他们将能够设置他们的时区,并相应地修改论坛上的所有日期.我是否必须创建一个带有时区名称和数字
1)我正在编写一个论坛,我无法弄清楚如何为论坛用户存储时区.他们将能够设置他们的时区,并相应地修改论坛上的所有日期.我是否必须创建一个带有时区名称和数字的数据库表来调整服务器时间? .NET是否在某处内置了时区支持?
2)一旦我弄清楚如何存储用户的时区,然后将DateTime对象修改到正确的时间,我就需要一种简单的方法将这个修改后的日期传递给MVC中的视图.例如,我有以下代码:
List<Topic> topics = board.Topics.OrderByDescending(x => x.Replies.Any() ? x.Replies.OrderBy(y => y.PostedDate).Last().PostedDate : x.PostedDate).ToList();
此主题对象作为视图模型对象的一部分传递给视图.视图循环遍历Model.Topics并显示主题列表.问题是我不想在视图中进行时区修改,因为我认为这对视图负有太大的责任.有没有办法在LINQ查询中修改主题日期?
提前致谢!
您可以获得时区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时间.这将使排序正确(关于夏令时),并且还限制在托管环境被移动时区或跨时区托管时可能出现的任何问题.