Я пытаюсь преобразовать переменную DateTime C # во время 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;
Есть ли способ лучше?
Ответы:
Вот в основном это. Вот методы, которые я использую для преобразования времени эпохи Unix и обратно:
Обновление: Начиная с .Net Core 2.1 и .Net Standard 2.1 DateTime, равный Unix Epoch, может быть получен из статического
DateTime.UnixEpoch
.источник
t specify this explicitly and somewhere later in code you
нет ToUniversalTime (), тогда у вас будет неправильное время Utc, потому что по умолчанию DateTime НЕ Utc.Если остальная часть вашей системы в порядке с DateTimeOffset вместо DateTime, есть действительно удобная функция:
источник
var time = DateTimeOffset.FromUnixTimeSeconds(5000);
MS DocЕдинственное, что я вижу, это то, что это должно быть с полуночи 1 января 1970 года по всемирному координированному времени.
источник
Вероятно, вы захотите использовать DateTime.UtcNow, чтобы избежать проблемы с часовым поясом
источник
Такой подход будет хорош, если дата-время, о которой идет речь, находится в формате UTC или представляет местное время в области, в которой никогда не наблюдалось летнее время. Подпрограммы разницы DateTime не принимают во внимание переход на летнее время и, следовательно, будут рассматривать полночь 1 июня как кратную 24 часам после полуночи 1 января. Я не знаю ничего в Windows, что сообщает исторические правила перехода на летнее время для текущего locale, поэтому я не думаю, что есть хороший способ правильно обрабатывать любое время до последнего изменения правила перехода на летнее время.
источник
Вы можете создать startTime и endTime для DateTime, а затем выполнить endTime.Subtract (startTime). Затем выведите свой промежуток в секундах.
Я думаю, это должно сработать.
источник
Я использую в своих расчетах 2000 год вместо Эпохи. Работу с меньшими числами легко хранить и транспортировать, а также поддерживает JSON.
Секунды с 2000 года :
Секунды от времени Unix:
Например, 2020 год:
var year2020 = (new DateTime ()). AddYears (2019) .Ticks; // Потому что DateTime начинается уже в год 1
637134336000000000 тиков с 01.01 0001 г.
63713433600 Секунды с 1 января 0001 г.
1577836800 секунд с Великой эпохи
631152000 секунд с 2000 года
Ссылки:
Конвертер времени эпохи: https://www.epochconverter.com
Конвертер первого года: https://www.epochconverter.com/seconds-days-since-y0
источник