前后端同步日期格式
Synchronize date format between frontend and backend
假设我们有一个应用程序由 angularjs 前端和 asp.net wep api 作为后端组成。
客户在使用日期选择器时应使用他的文化(例如:En-US)。当数据 post 到后端时,我在那里有特定的文化(例如:Tr-TR)。
我想要一个处理日期时间格式的系统来轻松处理这种情况。例如,每当客户向后端发送请求时,我应该从请求中了解他的文化,然后在返回数据之前在序列化时将我的日期转换为该格式。
我应该创建什么类型的系统?
由于我还没有前端代码,我将在网络 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
};
您将此标记为关于 Web API 和 Angular,这是一个美丽的组合,使日期稍微少一些 really-difficult。
鉴于以下情况,请牢记一些技巧:
- 让每个人都使用 UTC。客户端向上发送 UTC,服务器向下发送 UTC。如果您使用 Angular 具有 built-in 的
date
过滤器,它会自动将任何 UTC 日期调整为本地浏览器时间。同样,input[type="datetime-local"]
个元素也将执行该转换。
- 使用 ISO 格式序列化。 JSON.net 默认情况下会这样做;不要改变它。如果您将
DateTime
对象发送为 yyyy-MM-ddTHH:mm:ssZ
,任何客户端框架(包括 Angular)都会正确解析它。即使从哲学的角度来看,想想看:你的后端不应该为你的视图显示格式化日期,它应该只提供一个日期对象。 JSON 没有 "date objects," 所以我们选择下一个最接近的东西。
基本上,不要让您的 Web Api 担心文化问题。 APIs 的部分优点在于它们非常灵活。让您的 front-end 框架担心在什么情况下如何显示日期。正好Angular很擅长这个
如果你坚持这样做,一切都会 运行 顺利并且易于维护。
有时会有一些奇怪的 edge-cases 你必须在其中添加修改来支持它,并且可能更容易改变文化 server-side 或在本地时间存储东西(比如,Entity Framework 需要一个助手告诉它所有的 DateTime
值都应该将它们的种类更改为 Utc
,否则 JSON.net 将把它们序列化为当地时间,它们将被你关闭UTC 偏移量)。但是从去过那里的人那里拿走,值得在 long-run 中正确地做。添加任何必要的助手来实现上述所有功能,它会非常有效。
假设我们有一个应用程序由 angularjs 前端和 asp.net wep api 作为后端组成。
客户在使用日期选择器时应使用他的文化(例如:En-US)。当数据 post 到后端时,我在那里有特定的文化(例如:Tr-TR)。
我想要一个处理日期时间格式的系统来轻松处理这种情况。例如,每当客户向后端发送请求时,我应该从请求中了解他的文化,然后在返回数据之前在序列化时将我的日期转换为该格式。
我应该创建什么类型的系统?
由于我还没有前端代码,我将在网络 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
};
您将此标记为关于 Web API 和 Angular,这是一个美丽的组合,使日期稍微少一些 really-difficult。
鉴于以下情况,请牢记一些技巧:
- 让每个人都使用 UTC。客户端向上发送 UTC,服务器向下发送 UTC。如果您使用 Angular 具有 built-in 的
date
过滤器,它会自动将任何 UTC 日期调整为本地浏览器时间。同样,input[type="datetime-local"]
个元素也将执行该转换。 - 使用 ISO 格式序列化。 JSON.net 默认情况下会这样做;不要改变它。如果您将
DateTime
对象发送为yyyy-MM-ddTHH:mm:ssZ
,任何客户端框架(包括 Angular)都会正确解析它。即使从哲学的角度来看,想想看:你的后端不应该为你的视图显示格式化日期,它应该只提供一个日期对象。 JSON 没有 "date objects," 所以我们选择下一个最接近的东西。
基本上,不要让您的 Web Api 担心文化问题。 APIs 的部分优点在于它们非常灵活。让您的 front-end 框架担心在什么情况下如何显示日期。正好Angular很擅长这个
如果你坚持这样做,一切都会 运行 顺利并且易于维护。
有时会有一些奇怪的 edge-cases 你必须在其中添加修改来支持它,并且可能更容易改变文化 server-side 或在本地时间存储东西(比如,Entity Framework 需要一个助手告诉它所有的 DateTime
值都应该将它们的种类更改为 Utc
,否则 JSON.net 将把它们序列化为当地时间,它们将被你关闭UTC 偏移量)。但是从去过那里的人那里拿走,值得在 long-run 中正确地做。添加任何必要的助手来实现上述所有功能,它会非常有效。