C #: DateTime.UtcNow меняется на местное время после присвоения объекту - PullRequest
0 голосов
/ 23 мая 2018

В моем коде не так много замечательного.Вот в основном то, что меня беспокоит.

Node.cs

public class Node {
    public string Name { get; set; }
    public DateTime LastCheckin { get; set; }
}

NodeUpdateReceiver.cs Get запускается EventHandler.Process предоставляется Node

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

Как, черт возьми, это может произойти?Что я упускаю при назначении этого DateTime, который преобразовывает его в местное время?Любые указатели или ресурсы будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Оказывается, это было что-то конкретное для моей базы данных ( LiteDB , в моем примере не показано).Я должен был включить это.

Неясно, что именно произошло.Я не могу найти причину, почему, но время UTC сохранялось как Местное время.Предложение Алекса использовать check.ToUniversalTime() для оценки сработавшего DateTime.

В этом выпуске github рассказывается о некоторых сложностях DateTime, связанных с LiteDB, но не о моих конкретно: https://github.com/mbdavid/LiteDB/issues/794

0 голосов
/ 23 мая 2018

node.LastCheckin имеет тип DateTime

Что вы видите, когда делаете:

Console.WriteLine(node.LastCheckin);

Является ли локальное представление этого экземпляра DateTime
Если этодолжны были быть выполнены на другой машине, с другой временной зоной, вы бы увидели другой результат (все еще со смещением по UTC)

Чтобы вернуть UTC, вам нужно будет использовать .ToUniversalTime()

Console.WriteLine(node.LastCheckin.ToUniversalTime());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...