C# Epoch DateTime преобразование - PullRequest
2 голосов
/ 02 марта 2020

Мне нужно работать со временем эпохи в c#, и я создал для этого два следующих метода расширения:

public static DateTime ToDateTime(this double epochTime)
{
    return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epochTime);
}

public static double ToEpochTime(this DateTime dt)
{
    var t = dt - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return t.TotalSeconds;
}

Я получаю ошибку, когда запускаю следующий тест:

[Fact]
public void Test_EpochTime()
{
    var dateToTest = DateTime.Now;

    var epoch = dateToTest.ToEpochTime();
    var result = epoch.ToDateTime();

    Assert.Equal(result, dateToTest);
}

Результат:

Xunit.Sdk.EqualException: 'Ошибка Assert.Equal ()

Ожидается: 2020-03-02T17: 43: 19.1830000Z

Факт: 2020-03-02T17: 43: 19.1831870 + 00: 00 '

Кто-нибудь сталкивался с этим раньше, где существует проблема с преобразованием между double / DateTime?

Спасибо за любые указатели заранее!

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Двойной тип имеет достаточную точность, чтобы удерживать его в миллисекундах. Если вы хотите большей точности, вам придется использовать DateTime.Ticks, что является длинным. Long - это точное значение, оно не изменится.

Если вам нужны миллисекунды, то, как указывает @Magnetron, для этого есть встроенные методы. Прежде всего, и это общий совет, если вам нужно точное значение, не используйте типы double или float.

0 голосов
/ 02 марта 2020

Для меня решение было изменить и использовать Ticks для большей точности (спасибо @iakobski). Вот обновленные методы расширения:

public static DateTime ToDateTime(this long epochTime)
{
    return new DateTime(1970, 1, 1, 0, 0, 0).AddTicks(epochTime);
}

public static long ToEpochTime(this DateTime dt)
{
    var t = dt.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0);
    return t.Ticks;
}
...