C# 根据指定的绑定更改更改日期时间

C# 根据指定的绑定更改更改日期时间,c#,datetime,C#,Datetime,DateTime类型有一个名为“DateTimeKind”的枚举属性,可以将其设置为“Local”、“Unspecified”和“Utc”之一 当使用“datetime”格式从数据库查询该值时,如果使用Dapper查询该值,则该DateTimeKind为“未指定”,然后自动计算“DateTimeOffset”对象中实例化的到本地时间的时间 当前的后端标准是Utc,我想创建一个属性来处理这个默认为“Utc”的“DateTimeKind”值,因为这是预期的结果 不仅如此,我还想创建一些助手函数自动转

DateTime类型有一个名为“DateTimeKind”的枚举属性,可以将其设置为“Local”、“Unspecified”和“Utc”之一

当使用“datetime”格式从数据库查询该值时,如果使用Dapper查询该值,则该DateTimeKind为“未指定”,然后自动计算“DateTimeOffset”对象中实例化的到本地时间的时间

当前的后端标准是Utc,我想创建一个属性来处理这个默认为“Utc”的“DateTimeKind”值,因为这是预期的结果

不仅如此,我还想创建一些助手函数自动转换日期时间值,并将specifyKind设置为“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);
            }
        }
    }

请告诉我是否有不重新发明轮子的方法。

DateTime是不可变结构,您不能修改任何内容

创建结构时必须设置DateTimeKind,许多构造函数中的一些都包括DateTimeKind

默认值为DateTimeKind.unspecified,这是决定性的,因为您尚未指定它

你可以这样做,如果你想明确的话

  DateTime time2 = new DateTime(time1.Ticks, DateTimeKind.Utc) 
这是一个廉价的操作,因为它是一个结构。这里并不是在堆上分配内存。

您可以在setter中使用:

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

这会自动将种类设置为Utc吗?它将强制在返回的DateTime中使用DateTImeKind.Utc。请注意,如果未指定值的DateTImeKind,则它将被视为世界时,而不改变时区。@hal:否,它将被视为本地,并进行时区转换。从您链接到的文档中的备注中可以看出:“未指定当前日期时间对象假定为本地时间,转换的执行方式就好像种类是本地的一样。”如果我理解正确,OP不想这样做(尽管还不是很清楚)@swcraft:您目前已经接受了这个答案-我强烈建议您检查是否确实想要执行本地->UTC转换。我认为使用DateTime.SpecifyKind是一种更清晰的方法。是的,就口味而言,一个和另一个一样好。想要指出发生了什么,并且该设置与转换无关,它更多的是一个附加信息。您能否澄清“然后自动计算DateTimeOffset对象内实例化的本地时间”的意思?现在还不清楚您想要实现什么,包括“创建一些辅助函数自动转换日期时间值”的意思。如果您想保留当前日期/时间值,但只是将其更改为UTC,那么您已经在做正确的事情了。。。如果您的数据库正在存储UTC,听起来这就是您想要做的。@swcraft-关于Dapper,我将以重复的方式结束。有关如何告诉Dapper希望所有
DateTime
值都设置为
DateTimeKind.Utc
,请参阅。如果您的问题比这更一般化,请让我知道。@JonSkeet-如果datetime值是datetime.Kind='Local',那么我想用datetime.Kind='Utc'将其转换为Utc时间。我编辑了下面的答案,以便更准确地处理不同的场景。谢谢。@swcraft:那么你想在这种情况下执行时区转换,但当它有一种未指定的类型时,大概不会吧?我想你会想为此写一个方法。@JonSkeet-你说得对,我最后写了一个DateTime的扩展方法。