Как преобразовать 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;
Есть ли лучший способ?
Ответы
Ответ 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