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

时间:2015-12-28 21:42:53

标签: c# angularjs datetime asp.net-web-api culture

假设我们有一个应用程序包含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;
    }
}

Json序列化配置:

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

1 个答案:

答案 0 :(得分:3)

您将此标记为关于Web API和Angular,这是一个美丽的组合,使日期稍微不那么困难。

考虑到这一点,请记住几个技巧:

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

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

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

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