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.
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();
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:
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);
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.
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):
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.
Respostas:
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; }
fonte
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 posteriorescurrentTimeMillis()
desse valor.Se é isso que você está procurando, o equivalente em C # é
Environment.TickCount
.fonte
C# give : 2688547
eJava give : 1390707872687
System.currentTimeMillis()
retorna a hora UTC em ms desde 1970, enquantoEnvironment.TickCount
retorna 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 usarSystem.nanoTime()
.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();
fonte
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
fonte
DateTimeOffset
método foi introduzido a partir do .Net 4.6.o
System.currentTimeMillis()
em java retorna a hora atual em milissegundos de 01/01/1970c # 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 :)
fonte
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); } }
fonte
d
não é usado. Para usar este código, você poderia escrevervar date = new DateTime(); var millis = date.currentTimeMillis();
Mas adate
variá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 emd
vez deDateTime.UtcNow
no corpo do método? Eu uso muito os métodos de extensão, mas não para isso.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
double
paralong
.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
fonte
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.
fonte
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
fonte
DateTime.UtcNow
é a melhor opçãoSe 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; }
fonte
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();
fonte