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?

Foi útil?

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:

  1. Take Time Atual
  2. Adicione Offset para Futuro (10 minutos, no seu exemplo)
  3. Subtrair meia-noite de 01 de janeiro de 1970
  4. 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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top