根据指定更改日期时间

时间:2019-11-12 16:35:09

标签: c# datetime

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);
            }
        }
    }

请让我知道是否有不重新发明轮子的方法。

2 个答案:

答案 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) 

这是一个便宜的操作,因为它是一个结构。这里不是在堆上真正分配内存。