DateTime类型具有一个名为“ DateTimeKind”的枚举属性,可以将其设置为以下项之一:“本地”,“未指定”和“ UTC”。
从数据库以“ datetime”格式查询该值时,如果使用Dapper查询该值,则此DateTimeKind为“未指定”,然后自动计算到本地时间(在“ DateTimeOffset”对象中实例化)。 >
当前的后端标准是Utc,我想创建一个属性来处理此默认为“ Utc”的“ DateTimeKind”值,因为这是预期的结果。
不仅如此,我还想创建一些辅助函数,以自动转换日期时间值,以及如果以其他种类的方式将指定的kindKind设置为'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);
}
}
}
请让我知道是否有不重新发明轮子的方法。
答案 0 :(得分:2)
您可以在设置器中使用DateTime.ToUniversalTime():
private DateTime? _someValue;
[DataMember]
public DateTime? SomeValue
{
get
{
return _someValue;
}
set
{
if (value.HasValue)
{
if(value.Kind == DateTimeKind.Local)
{
_someValue = value.Value.ToUniversalTime();
}
else if(value.Kind == DateTimeKind.Unspecified)
{
_someValue = DateTime.SpecifyKind(value, DateTimeKind.Utc)
}
}
}
}
答案 1 :(得分:1)
DateTime是不可变的结构,您不能进行任何修改。
创建结构时必须设置DateTimeKind。许多构造函数中的一些都包括DateTimeKind。
默认值为DateTimeKind.unspecified,这是确定性的,因为您尚未指定它。
如果您希望明确,则可以执行此操作。
DateTime time2 = new DateTime(time1.Ticks, DateTimeKind.Utc)
这是一个便宜的操作,因为它是一个结构。这里不是在堆上真正分配内存。