【发布时间】:2019-11-12 16:35:09
【问题描述】:
DateTime 类型有一个名为“DateTimeKind”的枚举属性,可以设置为以下之一:“Local”、“Unspecified”和“Utc”。
当从数据库中以 'datetime' 格式查询值时,如果使用 Dapper 进行查询,则此 DateTimeKind 为 'Unspecified',然后在 'DateTimeOffset' 对象中实例化时自动计算到本地时间的时间。
当前的后端标准是 Utc,我想创建一个属性来处理这个“DateTimeKind”值,默认为“Utc”,因为这是预期的。
不仅如此,我还想创建一些辅助函数自动转换日期时间值以及将指定类型设置为“Utc”,如果它是作为不同类型提供的。
一个简单的想法是在 setter 中处理类似的东西:
private DateTime? _someValue;
[DataMember]
public DateTime? SomeValue
{
get
{
return _someValue;
}
set
{
if (value.HasValue)
{
//Todo: do something more such as converting datetime value as well if DateTimeKind was not Utc as coming in..
_someValue = DateTime.SpecifyKind(value.Value, DateTimeKind.Utc);
}
}
}
如果有已知的方法可以不重新发明轮子,请告诉我。
【问题讨论】:
-
您能否澄清您所说的“然后自动计算本地时间的时间作为在 DateTimeOffset 对象中实例化的时间”?目前尚不清楚您要实现什么 - 包括“创建一些辅助函数自动转换日期时间值”的意思。如果您想保留当前日期/时间值,但只是将 Kind 更改为 UTC,那么您已经在做正确的事情了……如果您的数据库正在存储 UTC,听起来就像这样是你想做的。
-
@swcraft - 关于 Dapper,我将作为重复关闭。请参阅 that answer 了解如何告诉 Dapper 您希望所有
DateTime值都设置为DateTimeKind.Utc。如果您的问题比这更笼统,请告诉我。 -
@JonSkeet - 如果日期时间值以 DateTime.Kind = 'Local' 的形式出现,那么我想使用 DateTime.Kind = 'Utc' 将其转换为 Utc 时间。我编辑了下面的答案,以便更精确地处理不同的场景。谢谢。
-
@swcraft:所以您想在 那种 的情况下执行时区转换,但不是在它有一种未指定的情况下,大概?我怀疑你会想为此编写一个方法。
-
@JonSkeet - 你是对的,我最终写了一个 DateTime 的扩展方法。