C# 日期时间本地化。任何标准/最佳做法

C# 日期时间本地化。任何标准/最佳做法,c#,asp.net-mvc,datetime,localization,timezone,C#,Asp.net Mvc,Datetime,Localization,Timezone,我唯一知道的是,DateTime应该始终存储在UTC中,但在显示或获取输入时,它必须是登录用户的本地时间 这是为了缓解时区问题 是否有任何标准/最佳实践,我必须触及已开发代码库的最低部分 在收到请求时,我可以使用ModelBinder(Asp.Net MVC)。但是在呈现响应时,我应该拦截什么来修改DateTime类型呢 如果您的系统有用户,我们将非常感谢您提供的任何帮助。…最好针对这些用户设置区域性代码 这样,在基本控制器上,您可以覆盖已执行的操作,并在线程上设置用户的区域性。比如: prot

我唯一知道的是,DateTime应该始终存储在UTC中,但在显示或获取输入时,它必须是登录用户的本地时间

这是为了缓解时区问题

是否有任何标准/最佳实践,我必须触及已开发代码库的最低部分

在收到请求时,我可以使用ModelBinder(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
对象,都可以使用:


或者,如果您不需要短格式,您可以使用自己的格式使用
ToString
,在线程上传递区域性

,因为您正在存储UTC时间,您还需要使用
TimeZoneInfo
类或根据您拥有的时区信息类型将其转换为用户时区


根据您的场景,您可能希望使用标准IANA/Olson时区数据库,而不是Microsoft Windows数据库。有关详细信息,请参阅。

谢谢!我要用这个,看看它是否有用。我必须这么做。有一个功能,用户互动,发送消息和所有。用户可以是基于不同时区的。所以我必须以UTC格式存储它,并以本地格式显示。@Adamhuldsworth切换区域设置会影响字符串格式,但与转换不同时区无关。如果他想记录一个特定的时间点,那么它必须是UTC日期时间或DateTimeOffset。否则就有歧义了。@MattJohnson道歉,我是在和别的东西交叉。@Adamhuldsworth没问题。:)@AdamHouldsworth另见:
string localistedDate = yourDate.ToShortDateString();