我唯一知道的是,DateTime 应始终以 UTC 存储,但在显示或获取输入时,它必须是登录用户的本地时间。
这是为了缓解时区问题。
任何标准/最佳实践,我必须触及已经开发的代码库的最小部分?
在收到请求时,我可以使用 ModelBinders (Asp.Net MVC)。但是我应该拦截什么来修改 DateTime 类型,同时呈现响应?
任何帮助将不胜感激 ....
我唯一知道的是,DateTime 应始终以 UTC 存储,但在显示或获取输入时,它必须是登录用户的本地时间。
这是为了缓解时区问题。
任何标准/最佳实践,我必须触及已经开发的代码库的最小部分?
在收到请求时,我可以使用 ModelBinders (Asp.Net MVC)。但是我应该拦截什么来修改 DateTime 类型,同时呈现响应?
任何帮助将不胜感激 ....
如果您的系统有用户,一个好主意是针对这些用户设置文化代码。
这样,在您的基本控制器上,您可以覆盖执行的操作并在线程上设置用户的文化。就像是:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (currentUser != null) //user your user object
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(currentUser.Culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(currentUser.Culture);
}
else
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
}
}
然后,每当您使用DateTime
对象时,都可以使用ToShortDateString
:
string localistedDate = yourDate.ToShortDateString();
或者如果你不想要短格式,你可以使用ToString
你自己的格式,在线程上传递文化
由于您要存储 UTC 时间,因此您还需要使用TimeZoneInfo
类或NodaTime将其转换为用户时区,具体取决于您拥有的时区信息类型。
根据您的方案,您可能希望使用标准 IANA/Olson 时区数据库,而不是 Microsoft Windows 数据库。有关详细信息,请参阅TimeZone 标记 wiki。