Java System.currentTimeMillis () equivalente em C #

86

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

matt b
fonte
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;
}
Jon Skeet
fonte
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.

Barend
fonte
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();
bstabile
fonte
8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Ramunas
fonte
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 :)

Tem
fonte
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);
    }
}
Joel Coehoorn
fonte
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
gimel
fonte
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.

Cristian Libardo
fonte
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
TechCrap
fonte
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;
}
Aubin
fonte
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();
Azul amargo
fonte