Calculando Futuro Epoch Time in C #
Pergunta
Eu era capaz de encontrar exemplo de código para obter o timestamp atual em Linux Epoch (segundos desde meia-noite 01 de janeiro de 1970), porém estou tendo dificuldades para encontrar um exemplo de como calcular o que o Epoch será no futuro, digamos por exemplo, 10 minutos a partir de agora, então como posso calcular um tempo futuro em Linux Epoch?
Solução
Este método de extensão deve fazer o trabalho:
private static double GetUnixEpoch(this DateTime dateTime)
{
var unixTime = dateTime.ToUniversalTime() -
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return unixTime.TotalSeconds;
}
E você pode usá-lo como tal:
var unixTime1 = DateTime.Now.GetUnixEpoch(); // precisely now
var unixTime2 = (DateTime.Now + new TimeSpan(0, 10, 0)).GetUnixEpoch(); // 10 minutes in future
Note que você precisa para lidar com todas as datas-vezes em UTC (Tempo Universal), uma vez que é como o início do Unix Epoch é definido.
Outras dicas
Há uma torção interessante quando você quer saber o tempo Unix Epoch em .Net em um sistema Windows.
Para quase todos os casos práticos e assumindo que o tempo atual é passado o Unix Epoch você poderia de fato levar
System.TimeSpan timeDifference = DateTime.UTCNow -
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long unixEpochTime = System.Convert.ToInt64(timeDifference.TotalSeconds);
Mas,
Unix Epoch Tempo é definido como" ... um sistema para descrever pontos no tempo, definida como o número de segundos decorridos desde a meia-noite Tempo Universal Coordenado (UTC), de 1 de janeiro de 1970 não contando os segundos bissextos ." (1)
Desde 1972, UTC incluiu "segundos bissextos", e nós tivemos um total de 25 deles até agora. (2)
O .NET DateTime não tem provisões para segundo salto, mas simplesmente contar com o tempo OS. Windows é alegremente inconscientes do segundo salto (3) (4), e por isso só vai ter a noção de tempo, uma vez que recebe de seu mestre NTP (Eu acredito que o padrão para uma máquina não seja de domínio conectado é time.windows.com) , que é, provavelmente, servindo-se UTC incluindo segundos bissextos.
Isto significa que, a fim de ser pedante correta sobre o número real de segundos se passaram desde a época Unix, você provavelmente deve adicionar os segundos bissextos ao resultado obtido acima para aplicativos que dependem disso. Você teria que acompanhar o número de segundos para adicionar a cada vez desde segundos bissextos não são anunciados com muita antecedência (2). No entanto, como a definição de Unix Epoch Tempo explicitamente exclui saltar segundos, você pode seguramente ignorar isso e segundos simplesmente Recalcular a hora UTC atual.
Às vezes, segundo salto causam caos software (5). O debate sobre a possibilidade de manter ou eliminar a prática é em curso (6) (7) (8).
O último segundo salto no momento da resposta ocorreu no dia 1 de julho de 2012 (9) e problemas causados ??para vários sites e aplicações (10)
(1) http://en.wikipedia.org/wiki/Unix_time
(2) http://en.wikipedia.org/wiki/Leap_second
(3) http://support.microsoft.com/kb/909614
(4) http://www.meinberg.de/english/info /leap-second.htm
(5) http: // www .networkworld.com / news / 2009/010609-pulo de segunda-snafu-afeta-oracle.html
(6) http://www.pcworld.idg.com. au / article / 358024 / time_waits_no_one_leap_seconds_may_cut /
(7) http://queue.acm.org/detail.cfm?id = 1967009
(8) http://arxiv.org/abs/1106.3141
(9) http://hpiers.obspm.fr/iers/bul /bulc/bulletinc.dat
(10) http://arstechnica.com/business/2012/07/one-day-later-the-leap-second-v-the-internet-scorecard/
(A resposta original tinha um erro, que foi felizmente pego pelos comentadores Edward Brey e Mormegil abaixo)
O que é a função que você usa para obter o tempo atual?
Claro que leva um .NET DateTime parâmetro ...
Com certeza é apenas uma simples questão de passar em um DateTime futuro para a função.
ou fazendo um DateDiff em segundos entre o momento atual e o tempo futuro e acrescentando que por diante.
var dt = new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime();
var now = System.DateTime.Now.ToUniversalTime();
var future = new DateTime(2010, 1, 1).ToUniversalTime();
Console.WriteLine((now - dt).TotalSeconds);
Console.WriteLine((future - dt).TotalSeconds);
A solução básica:
- Take Time Atual
- Adicione Offset para Futuro (10 minutos, no seu exemplo)
- Subtrair meia-noite de 01 de janeiro de 1970
- Obter o número total de segundos entre os dois
Em c # (fora do topo da minha cabeça, não testado):
DateTime myEpoch = DateTime.Now.Add( new TimeSpan(...) );
return myEpoch.Subtract( new DateTime(1970, 1, 1, 0, 0, 0) ).TotalSeconds;