Подтвердить что ты не робот

Как преобразовать DateTime в число секунд с 1970 года?

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

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

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

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

4b9b3361

Ответ 1

Это в основном это. Это методы, которые я использую для преобразования в и из эпохи 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);
}

Ответ 2

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

long unixSeconds = DateTimeOffset.Now.ToUnixTimeSeconds();

Ответ 3

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

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

Ответ 4

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

TimeSpan span= DateTime.UtcNow.Subtract(new DateTime(1970,1,1,0,0,0)); 

Ответ 5

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

Ответ 6

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

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

Ответ 7

.NET Core имеет DateTime.UnixEpoch.Second