在我的SQL Server数据库中,我将所有DateTime
值存储为UTC。但是,在某些情况下,我不关心时间,例如某个随机时区中的用户使用DatePicker选择日期时。在这些情况下,将它们存储为Date
与DateTime
似乎更有意义。
当从数据库中获取日期并通过Web API将其发送到Angular应用程序时,我想确保所有DateTime
值的格式都可以使Angular知道它们是UTC日期,并且显示为本地时间,因此我将其添加到Web API中以在末尾添加“ Z”:
// Set all dates to UTC
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter
{
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
});
这有效,但是问题在于此转换也同样适用于我的Date
值。当日期从数据库中拉到C#时,它们在DateTime
变量中,因为C#没有Date
变量,因此它们的时间为午夜。因此,如果CST中的用户选择的日期为11/24/2018,则当它往返于数据库并返回时,它将变为11/23/2018(下午6:00的时间被截断)。
如何防止这种行为?一些想法可能是:
Date
还是DateTime
值。DateTime
吗?
答案 0 :(得分:1)
使用@John的建议,我创建了一个自定义IsoDateTimeConverter:
public class DateConverter : IsoDateTimeConverter
{
public DateConverter()
{
DateTimeFormat = "MM-dd-yyyy";
}
}
并手动将其应用于每个Date
值,该值将覆盖我添加到Web API配置中的全局转换器。
[JsonConverter(typeof(DateConverter))]
public System.DateTime StartDate { get; set; }
我仍然希望有一种全局的处理方式,而不是必须将属性应用于每个Date
属性,但这至少使我感到困惑。
向Angular用户发出警告。我最初尝试使用格式“ yyyy-MM-dd”,但是它必须将其解释为UTC,因为在向用户显示日期时我遇到了同样的问题。不过将其更改为“ MM-dd-yyyy”也可以。参见https://github.com/angular/material2/issues/6111