Estou tentando converter uma variável C # DateTime para o tempo Unix, ou seja, o número de segundos desde 1º de janeiro de 1970. Parece que um DateTime está realmente implementado como o número de 'tiques' desde 1º de janeiro de 0001.
Meu pensamento atual é subtrair 1º de janeiro de 1970 do meu DateTime assim:
TimeSpan span= DateTime.Now.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
Existe uma maneira melhor?
Respostas:
É basicamente isso. Estes são os métodos que uso para converter de e para o tempo de época do Unix:
Atualização: A partir do .Net Core 2.1 e do .Net Standard 2.1, um DateTime igual ao Unix Epoch pode ser obtido no estático
DateTime.UnixEpoch
.fonte
t specify this explicitly and somewhere later in code you
tiver o ToUniversalTime (), terá um tempo Utc ruim, porque por padrão o DateTime NÃO é Utc.Se o resto do seu sistema estiver OK com DateTimeOffset em vez de DateTime, há um recurso realmente conveniente:
fonte
var time = DateTimeOffset.FromUnixTimeSeconds(5000);
MS DocA única coisa que vejo é que deveria ser desde a meia-noite de 1º de janeiro de 1970 UTC
fonte
Você provavelmente deseja usar DateTime.UtcNow para evitar problemas de fuso horário
fonte
Essa abordagem será boa se a data / hora em questão estiver em UTC ou representar a hora local em uma área que nunca observou o horário de verão. As rotinas de diferença DateTime não levam em consideração o horário de verão e, consequentemente, considerarão a meia-noite de 1º de junho como um múltiplo de 24 horas após a meia-noite de 1º de janeiro. Não tenho conhecimento de nada no Windows que relata regras históricas de horário de verão para locale, portanto, não acho que haja uma boa maneira de lidar corretamente com qualquer horário anterior à alteração mais recente da regra de horário de verão.
fonte
Você pode criar um startTime e endTime de DateTime e, em seguida, endTime.Subtract (startTime). Em seguida, imprima seu span.Seconds.
Acho que deve funcionar.
fonte
Eu uso o ano 2000 em vez do Epoch Time no meu cálculo. Trabalhar com números menores é fácil de armazenar e transportar e é compatível com JSON.
Segundos do ano 2000 :
Segundos do horário Unix:
Por exemplo, o ano de 2020 é:
var year2020 = (new DateTime ()). AddYears (2019) .Ticks; // Porque DateTime começa já no ano 1
637134336000000000 Carrapatos desde 1º de janeiro de 0001
63713433600 segundos desde 1º de janeiro de 0001
1577836800 segundos desde a hora da época
631152000 segundos desde o ano 2000
Referências:
Conversor Epoch Time: https://www.epochconverter.com
Conversor do ano 1: https://www.epochconverter.com/seconds-days-since-y0
fonte