c# - 当存储为 UTC 时,如何全局序列化和反序列化 Date 与 DateTime?
问题描述
在我的 SQL Server 数据库中,我将所有DateTime
值存储为 UTC。但是,在某些情况下,我不关心时间,例如某个随机时区的用户使用 DatePicker 选择日期。Date
在这些情况下,只存储 as vs似乎更有意义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 中的用户选择 2018 年 11 月 24 日的日期,当它往返于数据库并返回时,它将变为 2018 年 11 月 23 日(截断下午 6:00 的时间)。
如何防止这种行为?一些想法可能是:
- 有条件地应用 IsoDateTimeConverter?
- 我认为这在全球范围内是不可能的,因为我无法判断它是存储在 C# DateTime 变量中的值
Date
还是值。DateTime
- 我认为这在全球范围内是不可能的,因为我无法判断它是存储在 C# DateTime 变量中的值
- 将 SQL Server 中的数据类型更改为
DateTime
?- 我认为这也行不通,因为即使我根据数据的来源存储时间,对于其他时区的用户来说,这难道不是错误的吗?
解决方案
使用@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
推荐阅读
- python - flask wtforms QuerySelectFeld form.populate_obj 字段未填充,如果填写错误翻译引发
- django - 使用嵌套序列化程序时避免嵌套对象
- javascript - 使用 Django 为 AJAX 提取多个 HTML DOM 元素时遇到问题
- powershell - BufferCell 属性只读?
- netcdf - xarray to_netcdf 不是 netCDF
- java - WebElement.SendKeys(路径)问题:org.openqa.selenium.InvalidArgumentException:无效参数:找不到文件
- c - 检查两个文件是否相同
- c# - 添加孩子时xamarin滚动视图跳跃
- python - 传递给 Ordered Dict 创建的列表理解被创建为参考
- linux - 在 bash 脚本中调用 SSH Sudo 命令