在前端和后端之间同步日期格式

mav*_*era 1 c# culture datetime asp.net-web-api angularjs

假设我们有一个由 angularjs 前端和作为后端的 asp.net wep api 组成的应用程序。

客户在使用 datepicker 时应该使用他的文化(例如:En-US)。当数据将发布到后端时,我在那里有特定的文化(例如:Tr-TR)。

我想要一个系统来处理日期时间格式来轻松管理这种情况。例如,每当客户端向后端发送请求时,我应该从请求中了解他的文化,然后在返回数据之前在序列化时将我的日期转换为该格式。

我应该创建什么类型的系统?

由于我还没有前端代码,我将在 web api 端分享我的文化配置。

设置文化

public class CultureConfig
{
    public static void Register()
    {
        //Get the culture info of the language code
        const string uiLanguage = "Tr";//"En-US";
        var culture = CultureInfo.CreateSpecificCulture(uiLanguage);
        CultureInfo.DefaultThreadCurrentCulture = culture;
        CultureInfo.DefaultThreadCurrentUICulture = culture;
    }
}
Run Code Online (Sandbox Code Playgroud)

Json 序列化配置:

  var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings = new JsonSerializerSettings()
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
            DateTimeZoneHandling = DateTimeZoneHandling.Unspecified,
            Culture = CultureInfo.DefaultThreadCurrentCulture
        };
Run Code Online (Sandbox Code Playgroud)

Mat*_*gen 7

您将其标记为关于 Web API 和 Angular,这是一个美妙的组合,使约会变得不那么困难。

考虑到以下几点,请记住以下几个技巧:

  • 让每个人都使用 UTC。客户端向上发送 UTC,服务器向下发送 UTC。如果您使用dateAngular 内置的过滤器,它会自动将任何 UTC 日期调整为本地浏览器时间。同样,input[type="datetime-local"]元素也将执行该转换。
  • 使用 ISO 格式进行序列化。JSON.net 默认会这样做;不要改变它。如果您将DateTime对象发送为yyyy-MM-ddTHH:mm:ssZ,任何客户端框架(包括 Angular)都会正确解析它。即使从哲学的角度,想想看:你的后端不应该为你的视图设置日期格式,它应该只提供一个日期对象。JSON 没有“日期对象”,因此我们选择下一个最接近的对象。

本质上,不要让您的 Web Api 担心文化。API 的部分优点在于它们非常灵活。让你的前端框架担心在什么情况下如何显示日期。碰巧 Angular 非常擅长这一点。

如果你坚持这一点,一切都会顺利运行并且易于维护。

有时有一些奇怪的边缘情况,您必须添加修改以支持这一点,并且在服务器端更改文化或在本地存储内容可能更容易(例如,实体框架需要一个助手来告诉它所有DateTime值应该将它们的种类更改为Utc,否则 JSON.net 会将它们序列化为本地时间,并且它们会因您的 UTC 偏移量而关闭)。但是从去过那里的人那里得到它,从长远来看,这是值得做的。添加使上述所有事情发生所需的任何帮助程序,它会像魅力一样发挥作用。