时区策略我正在构建一个MVC3应用程序,用户可能不在同一时区,所以我的意图是将所有内容存储在UTC中并将UTC转换为本地时间查看,并在提交时将本地时间转换为UTC。尽管似乎没有很多好的解决方案,但还是进行了一些浏览。老实说,我有点希望有一个属性可以自动将UTC时间转换为本地时间,但它似乎不存在。我觉得只是尝试手动将每个输入转换为UTC并将每个视图手动转换为本地时间显示将非常容易出错,并且导致难以检测时间未转换为或未转换的错误。关于如何将此作为一般策略处理的任何建议?编辑每个人似乎都非常关注“如何获取客户端时区”一文,正如我在其中一条评论中提到的那样,这并不是我真正关心的问题。我可以使用用户设置来确定他们的时区,所以假设我已经知道客户的时区是什么……这不能解决我的问题。现在,在我呈现日期的每个视图上,我需要调用一个方法在UTC的本地时区中呈现它。每次我向服务器发送提交日期时,我都需要将其从本地时区转换为UTC。如果我忘记这样做,就会出现问题……提交的日期将是错误的,或者客户报告和过滤器将是错误的。我希望存在的是一种更自动化的方法,特别是因为视图模型在MVC3中是强类型的,我希望总和魔法至少在时区自动呈现,如果不处理提交,比如日期格式或范围可以由属性控制。所以像[DateRange]PublicDateTimeMyDate我可以有类似[ConvertToUTC(offset)]PublicDateTimeMyDate无论如何,我想我唯一的方法是编写自定义数据注释以在时区中呈现它,并在MVC3模型活页夹中转换传入日期,除非我想在方法中包装任何日期调用。因此,除非有人有进一步的意见或建议,否则它将是这两个选项之一,我只是感到惊讶,有些东西已经不存在了。如果我确实实施了解决方案,我一定会发布它。编辑2类似http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx的MVC3视图和视图模型就是我要找的东西。最终编辑我将epignosisx的回答标记为正确,但也有一些评论要添加。我在这里发现了类似的东西:http://dalldorf.com/blog/2011/06/mvc3-timezones-1/通过将时区放在cookie中,为第2部分中需要它的人实现时区(链接如下,因为文章第1部分到第2部分的链接不起作用)http://dalldorf.com/blog/2011/09/mvc3-timezones-2/需要注意的是,对于这些方法,必须使用Editfor和DisplayFor而不是像TextForFor这样的东西,因为只有EditFor和DisplayFor使用元数据提供程序来告诉MVC如何在模型上显示该类型的属性。如果直接在视图中访问模型值(@Model.MyDate),则不会进行任何转换。您可以使用DateTime的站点范围的DisplayTemplate处理将UTC转换为用户本地时间的操作。从您的角度来看,您可以使用@Html.DisplayFor(n=>n.MyDateTimeProperty)第二个问题更难解决。要将用户本地时间转换为UTC,您可以覆盖DefaultModelBinder。特别是SetProperty方法。这是一个证明这一点的简单实现。它只适用于DateTime但可以轻松扩展到DateTime?.然后在Global.asax中将其设置为默认绑定器=typeof(DateTime)){if(propertyDescriptor.IsReadOnly){返回;}try{if(value!=null){DateTimedt=(DateTime)value;propertyDescriptor.SetValue(bindingContext.Model,dt.ToUniversalTime());}}catch(Exceptionex){stringmodelStateKey=CreateSubPropertyName(bindingContext.ModelName,propertyDescriptor.Name);bindingContext.ModelState.AddModelError(modelStateKey,ex);}}else{//处理所有其他类型base.SetProperty(controllerContext,bindingContext,propertyDescriptor,value);首先,这主要是我如何确定网络用户的时区?,我同意这个回复的大多数选票:我见过的最流行的(==标准?)确定时区的方法是简单地询问用户自己。如果您的网站需要订阅,您可以将它们保存在用户的个人资料数据中。对于匿名用户,日期可以显示为UTC或GMT等。也就是说,自动设置此值的最常用方法是使用javascript的DategetTimezoneOffset()。然后可以通过cookie或ajax请求将其反馈到服务器,并与用户的配置文件、会话或cookie一起存储。最后,我仍然认为您应该允许用户更改它,这样您不仅可以确定UTC偏移量,还可以确定实际时区和夏令时信息。从用户收集输入时,通过DateTime转换为UTC应该就足够了。当客户端是托管代码时,DateTimeOffset非常有用;然而,对于纯html/javascript,它真的不会给你带来太多好处。此外,大多数应用程序不一定需要DateTimeOffset的附加信息,除非您打算向其他用户显示原始时区信息。我觉得只是尝试手动将每个输入转换为UTC并将每个视图手动转换为本地时间显示将非常容易出错,并且导致难以检测时间未转换为或未转换的错误。您不应该依靠勤奋来进行正确的日期+时间格式化和解析。.NET框架应该为您处理这个问题,初学者请参阅“如何:为ASP.NET网页全球化设置文化和UI文化”。结论坦率地说,这是一个令人头疼的问题。几年前我们放弃了实施,开始以UTC格式传输所有日期和时间信息,然后我们使用Javascript将其转换为本地时间和显示格式。恕我直言,这确实是唯一的工作模式。您可以使用MomentJS之类的东西来显示日期/时间。帮助格式化和本地时间。这是不可能的,你必须做一些手工工作。1如果你不想在数据库中存储用户的时区1.1没有母版页:正如csharptest.net建议使用java脚本的getDateTimeOffset()来获取时区偏移量,在cookie中设置值,编写一个模块来检查cookie是否存在cookieinsertjava脚本代码和cookie使用模块。1.2使用masterpage:同上但不需要写模块检查。2将用户的时区存储在数据库中(最好最简单)无需使用javascript获取时区,只需根据用户的时区转换日期时间即可。以上就是《C#学习教程:时区攻略分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
