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

Posted

技术标签:

【中文标题】在前端和后端之间同步日期格式【英文标题】:Synchronize date format between frontend and backend 【发布时间】:2015-12-28 21:42:52 【问题描述】:

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

客户在使用日期选择器时应该使用他的文化(例如: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
        ;

【问题讨论】:

您能否提供一个指向您正在使用的特定日期选择器组件的指针?如果不了解您可能已实施的更多细节并且仅依赖假设,则很难提供帮助。 嗨,@DarinDimitrov 其实我只是在假设。我还没有开始写前端。我只是在 web api 端创建我的基础设施。然后我想到了这个问题。我认为无论日期选择器是什么。假设有来自不同文化的客户的数据,我必须在后端处理它们。 在这种情况下,只需确保前端始终以 UTC 格式发送日期。这就是您绝对希望它们存储在后端的方式。不幸的是,由于您没有提供有关您正在使用的特定组件的任何具体细节,也没有提供序列化协议,所以这个问题几乎没有任何意义,可能应该关闭。 我添加了关于文化的代码。我希望它有助于澄清一些事情 我再次重复我的建议 - 使用 UTC 和 ISO8601 格式进行序列化。 【参考方案1】:

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

记住以下几个技巧:

让每个人都使用 UTC。客户端向上发送 UTC,服务器向下发送 UTC。如果您使用 Angular 内置的 date 过滤器,它会自动将任何 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 偏移量关闭)。但是从去过那里的人那里拿走它,从长远来看,这样做是值得的。添加任何必要的助手来完成上述所有操作,它会像一个魅力一样工作。

【讨论】:

这对我来说是非常有用的解释。可以肯定的是,您说使用带有默认设置的 Json.Net,因此它将使用 UTC。此外,根本不要设置文化信息。那么我应该删除我的 CultureConfig 吗?那么数据库(实体框架)部分呢。我也应该在那里保存为 UTC 吗? @mavera 是的,以 UTC 格式将内容保存到 EF。在Stack Overflow 上有一些关于将UTC 与EF 结合使用的问题可能值得一试,因为当它实现DateTime 对象时,它将默认为Unspecified,因此您必须解决它。但是,是的,我会删除你所有的 CultureConfig 东西。也许只是评论它以确保我们没有遗漏任何东西,但我已经开发了许多成功的 API,它们从来不需要这样的东西,所以我想不出你为什么会这样做。

以上是关于在前端和后端之间同步日期格式的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中格式化日期

SpringBoot学习笔记:处理前端JSON返回的日期的格式

前后端日期传递

ORA-01830: 日期格式图片在转换整个输入字符串之前结束(增量同步)

前端校验和后端校验

java 前后台日期验证