C#:DateTime.UtcNow在分配给对象后更改为本地时间

C#:DateTime.UtcNow在分配给对象后更改为本地时间,c#,datetime,timezone,C#,Datetime,Timezone,我的代码并没有太多值得注意的地方。这基本上是我所关心的 Node.cs public class Node { public string Name { get; set; } public DateTime LastCheckin { get; set; } } NodeUpdateReceiver.cs Get被EventHandler触发流程提供了一个节点 public class NodeUpdateReceiver { IDatabaseService da

我的代码并没有太多值得注意的地方。这基本上是我所关心的

Node.cs

public class Node {
    public string Name { get; set; }
    public DateTime LastCheckin { get; set; }
}
NodeUpdateReceiver.cs Get被EventHandler触发<代码>流程提供了一个
节点

public class NodeUpdateReceiver {

    IDatabaseService databaseService { get; }

    public NodeUpdateReceiver(IDatabaseService _dataService)
    {
        dataService = _dataService;
    }

    public async Task Process(Node node)
    {
        var newDate = DateTime.UtcNow
        Console.WriteLine(newDate); // 5/23/2018 1:58:41 PM - correct UTC

        node.LastCheckin = newDate;
        Console.WriteLine(node.LastCheckin) // 5/23/2018 9:25:19 AM - local time... wtf??

        dataService.SaveNodeAsync(node);
    } 
}

怎么会这样?分配这个将其转换为本地时间的日期时间,我遗漏了什么?任何指针或资源都将不胜感激。

节点。LastCheckin
类型为DateTime

当你这样做时,你看到的是:

Console.WriteLine(node.LastCheckin);
是该实例的本地表示形式
DateTime

如果在不同的机器上,在不同的时区执行,您将看到另一个结果(仍然偏移到UTC)

要恢复UTC,您需要使用
.ToUniversalTime()


节点。LastCheckin
的类型为DateTime

当你这样做时,你看到的是:

Console.WriteLine(node.LastCheckin);
是该实例的本地表示形式
DateTime

如果在不同的机器上,在不同的时区执行,您将看到另一个结果(仍然偏移到UTC)

要恢复UTC,您需要使用
.ToUniversalTime()


事实证明,这是我选择的数据库所特有的(LiteDB,在我的示例中未显示)。我应该包括在内

现在还不清楚到底发生了什么。我似乎找不到原因,但UTC时间被存储为本地时间。Alex建议使用
check.ToUniversalTime()
来评估工作日期时间

本期github讨论了LiteDB涉及的一些DateTime复杂性,但不是我的:

事实证明这是我选择的数据库所特有的(LiteDB,在我的示例中没有显示)。我应该包括在内

现在还不清楚到底发生了什么。我似乎找不到原因,但UTC时间被存储为本地时间。Alex建议使用
check.ToUniversalTime()
来评估工作日期时间

本期github讨论了LiteDB涉及的一些DateTime复杂性,但不是我的:

异常行为
2018年5月23日下午1:58:41
2018年5月23日上午9:25:19
不能进行UTC到本地的转换。我不认为任何两个区域之间的时差在30分钟之内。如果所述日期之间的差异约为4小时33米和几秒。这怎么可能呢?真的。OP需要提供一个。刚刚删除了我的答案,因为我也无法复制-你缺少一些代码吗?我照原样复制,并获得了2018年5月23日14:07:22的输出both@user1672994我不认为任何两个区域之间的时差在30分钟以内。对此我不确定。有些时区将
:45
作为UTC偏移量,例如尼泊尔和查塔姆群岛:)奇怪的行为
2018年5月23日下午1:58:41
2018年5月23日上午9:25:19
不能进行UTC到本地的转换。我不认为任何两个区域之间的时差在30分钟之内。如果所述日期之间的差异约为4小时33米和几秒。这怎么可能呢?真的。OP需要提供一个。刚刚删除了我的答案,因为我也无法复制-你缺少一些代码吗?我照原样复制,并获得了2018年5月23日14:07:22的输出both@user1672994我不认为任何两个区域之间的时差在30分钟以内。对此我不确定。有些时区将
:45
作为UTC偏移量,例如尼泊尔和查塔姆群岛:)@john这解决了问题,但日期时间取自同一进程。为什么
控制台.WriteLine(newDate)然后是“正确的”,而
Console.WriteLine(node.LastCheckin)不是吗?@Corak-似乎OP提供了过度简化的example@john这解决了问题,但是日期时间是从同一进程中获取的然后是“正确的”,而
Console.WriteLine(node.LastCheckin)
不是吗?@Corak-似乎OP提供了一个过于简化的示例很高兴你对它进行了排序,魔鬼通常在这些东西的细节中@亚历克斯谢谢你,先生。当然是。。。顺便说一句,我接受了你的回答。你先指出了它,即使我不认为可能是这样。很高兴你把它整理好了,魔鬼通常在这些事情的细节上@亚历克斯谢谢你,先生。当然是。。。顺便说一句,我接受了你的回答。你先指出了它,即使我认为那不可能。