Как я могу преобразовать DateTime в количество секунд с 1970 года? - PullRequest
108 голосов
/ 28 июля 2010

Я пытаюсь преобразовать переменную C # DateTime во время Unix, т. Е. Количество секунд с 1 января 1970 года. Похоже, что DateTime фактически реализован как число тиков с 1 января 0001 года.

Моя текущая мысль состоит в том, чтобы вычесть 1 января 1970 года из моего DateTime следующим образом:

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;

Есть ли лучший способ?

Ответы [ 6 ]

177 голосов
/ 28 июля 2010

Вот и все. Вот методы, которые я использую для преобразования в эпоху Unix и обратно:

public static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    return origin.AddSeconds(timestamp);
}

public static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    TimeSpan diff = date.ToUniversalTime() - origin;
    return Math.Floor(diff.TotalSeconds);
}
39 голосов
/ 25 июля 2016

Если с остальной частью вашей системы все в порядке с DateTimeOffset вместо DateTime, есть действительно удобная функция:

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();
22 голосов
/ 28 июля 2010

Единственное, что я вижу, это то, что это должно быть с полуночи 1 января 1970 года.

TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc));
return span.TotalSeconds;
14 голосов
/ 28 июля 2010

Возможно, вы хотите использовать DateTime.UtcNow, чтобы избежать проблемы с часовым поясом

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 
1 голос
/ 28 июля 2010

Такой подход будет хорош, если рассматриваемая дата-время указывается в UTC или представляет местное время в области, в которой никогда не было летнего времени. Процедуры разницы в DateTime не учитывают переход на летнее время и, следовательно, будут считать полночь 1 июня кратной 24 часам после полуночи 1 января. Мне ничего не известно в Windows, которая сообщает об исторических правилах летнего времени для текущего локали, поэтому я не думаю, что есть какой-то хороший способ правильно обработать любое время до самого последнего изменения правила перехода на летнее время.

0 голосов
/ 28 июля 2010

Вы можете создать startTime и endTime для DateTime, затем выполнить endTime.Subtract (startTime).Затем выведите ваш span.Seconds.

Я думаю, это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...