Java System.currentTimeMillis () equivalente em C #


86

Qual é o equivalente do Java System.currentTimeMillis()em C #?


Só por curiosidade, por que você precisa dos millis desde 1970?
Alex B de

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Respostas:


90

Uma alternativa:

private static readonly DateTime Jan1st1970 = new DateTime
    (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static long CurrentTimeMillis()
{
    return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
}

2
Mesmo resultado com "DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()"
Ramunas

75

Um idioma comum em Java é usar o currentTimeMillis()para fins de tempo ou programação, onde você não está interessado nos milissegundos reais desde 1970, mas em vez disso, calcule algum valor relativo e compare as chamadas posteriores currentTimeMillis()desse valor.

Se é isso que você está procurando, o equivalente em C # é Environment.TickCount.


1
Mas ambos fornecem números de diferença. Como eles se comparam corretamente ?? C# give : 2688547eJava give : 1390707872687
Elshan

1
@Elshan Você não pode compará-los. Eles são carrapatos diferentes. Essa técnica serve para cronometrar e agendar dentro de um aplicativo, não entre aplicativos.
Barend

System.currentTimeMillis()retorna a hora UTC em ms desde 1970, enquanto Environment.TickCountretorna ms desde que o aplicativo foi iniciado. System.currentTimeMillis()é bom para verificar o tempo decorrido, mas se você quiser que duas durações sejam comparáveis, você deve usar System.nanoTime().
michelpm,

12

Se você estiver interessado em TIMING, adicione uma referência a System.Diagnostics e use um cronômetro.

Por exemplo:

var sw = Stopwatch.StartNew();
...
var elapsedStage1 = sw.ElapsedMilliseconds;
...
var elapsedStage2 = sw.ElapsedMilliseconds;
...
sw.Stop();

8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

Esse DateTimeOffsetmétodo foi introduzido a partir do .Net 4.6.
Suncat2000

7

o System.currentTimeMillis()em java retorna a hora atual em milissegundos de 01/01/1970

c # isso seria

public static double GetCurrentMilli()
    {
        DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc);
        TimeSpan javaSpan = DateTime.UtcNow - Jan1970;
        return javaSpan.TotalMilliseconds;
    }

editar: tornou utc conforme sugerido :)


4
DateTime.Now usa a hora local, não UTC. Não sei exatamente o que acontece quando você subtrai um tipo desconhecido de DateTime de um local, mas é melhor definir ambos como UTC :)
Jon Skeet

7

Também poderíamos ser um pouco mais elaborados e fazer isso como um método de extensão, de modo que fique fora da classe DateTime:

public static class DateTimeExtensions
{
    private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    public static long currentTimeMillis(this DateTime d)
    {
        return (long) ((DateTime.UtcNow - Jan1st1970).TotalMilliseconds);
    }
}

3
Isso não é um pouco errado? Este método de extensão passará para qualquer instância de DateTime, mas não usa a instância. Só parece confuso ... Não acho que você deva exigir um parâmetro que você não usa
mortb de

1
@mortb Esse é um método de extensão. É assim que é definido em C # para "adicionar um método" a uma classe sem modificar a classe. O compilador interpreta o método e pode aplicá-lo a uma instância do parâmetro "this" como se fosse um método de instância na própria classe. Ele funciona da mesma forma que um método na classe estática, mas o compilador permite escrever uma sintaxe alternativa mais fácil.
Suncat2000

1
O problema é que o valor do parâmetro dnão é usado. Para usar este código, você poderia escrever var date = new DateTime(); var millis = date.currentTimeMillis();Mas a datevariável seria apenas redundante e seu estado nunca seria usado. Quando não está usando o estado do objeto, a criação de um método de extensão apenas obscurece o código. A resposta fornecida por @Hath é mais direta e, portanto, melhor (para mim). Talvez @Joel Coehoorn pretendesse usar o valor em dvez de DateTime.UtcNowno corpo do método? Eu uso muito os métodos de extensão, mas não para isso.
mortb

Por que você criaria uma extensão, que não usa a data? Usei esse código e ele me surpreendeu. A versão correta é: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G

4

Aqui está uma maneira simples de aproximar o carimbo de data / hora Unix. Usar o UTC está mais próximo do conceito unix e você precisa converter de doublepara long.

TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
long millis = (long)ts.TotalMilliseconds;
Console.WriteLine("millis={0}", millis);

estampas:

millis=1226674125796

exatamente o que eu precisava.
Ajibola

3

A estrutura não inclui os segundos antigos (ou milissegundos) desde 1970. O mais próximo que você obtém é DateTime.Ticks, que é o número de 100 nanossegundos desde 1º de janeiro de 0001.


1
(DateTime.Ticks / 10000000) - (o número de segundos entre 0001 e 1970) daria uma resposta precisa?
Liam

3

Eu apenas considero a maneira mais direta de alcançar o que você tem se esforçado da seguinte maneira:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowé a melhor opção
Mehdi Khademloo

2

Se você deseja que um carimbo de data / hora seja comparado entre diferentes processos, diferentes linguagens (Java, C, C #), sob GNU / Linux e Windows (sete pelo menos):

C #:

private static long nanoTime() {
   long nano = 10000L * Stopwatch.GetTimestamp();
   nano /= TimeSpan.TicksPerMillisecond;
   nano *= 100L;
   return nano;
}

Java:

java.lang.System.nanoTime();

C GNU / Linux:

static int64_t hpms_nano() {
   struct timespec t;
   clock_gettime( CLOCK_MONOTONIC, &t );
   int64_t nano = t.tv_sec;
   nano *= 1000;
   nano *= 1000;
   nano *= 1000;
   nano += t.tv_nsec;
   return nano;
}

C Windows:

static int64_t hpms_nano() {
   static LARGE_INTEGER ticksPerSecond;
   if( ticksPerSecond.QuadPart == 0 ) {
      QueryPerformanceFrequency( &ticksPerSecond );
   }
   LARGE_INTEGER ticks;
   QueryPerformanceCounter( &ticks );
   uint64_t nano = ( 1000*1000*10UL * ticks.QuadPart ) / ticksPerSecond.QuadPart;
   nano *= 100UL;
   return nano;
}

1

Eu sei que a pergunta pede equivalente, mas como eu uso esses 2 para as mesmas tarefas, coloco GetTickCount . Posso ser nostálgico, mas System.currentTimeMillis () e GetTickCount () são os únicos que uso para obter carrapatos.

[DllImport("kernel32.dll")]
static extern uint GetTickCount();

// call
uint ticks = GetTickCount();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.