C#でのJavaのSystem.currentTimeMillis()
と同等のものは何ですか?
別の方法:
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;
}
Java)の一般的なイディオムは、1970年以降の実際のミリ秒に興味がなく、代わりに相対値を計算するタイミングまたはスケジューリングの目的でcurrentTimeMillis()
を使用することですcurrentTimeMillis()
のその後の呼び出しをその値と比較します。
それがあなたが探しているものである場合、C#に相当するものはEnvironment.TickCount
。
タイミングに興味がある場合は、System.Diagnosticsへの参照を追加し、ストップウォッチを使用します。
例えば:
var sw = Stopwatch.StartNew();
...
var elapsedStage1 = sw.ElapsedMilliseconds;
...
var elapsedStage2 = sw.ElapsedMilliseconds;
...
sw.Stop();
System.currentTimeMillis()
in Java 1970/1/1からミリ秒単位で現在の時刻を返します
c#
public static double GetCurrentMilli()
{
DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc);
TimeSpan javaSpan = DateTime.UtcNow - Jan1970;
return javaSpan.TotalMilliseconds;
}
編集:提案どおりにutcにしました:)
また、少し凝った方法で拡張メソッドとして実行することもできます。そのため、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);
}
}
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Unixタイムスタンプを概算する簡単な方法を次に示します。 UTCの使用はUNIXの概念により近いため、double
から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);
プリント:
millis=1226674125796
私はあなたが次のように努力してきたことを達成する最も簡単な方法を考えています:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
フレームワークには、1970年以降の古い秒(またはミリ秒)は含まれません。最も近いのはDateTime.Ticksで、これは1月1日0001以降の100ナノ秒の数です。
タイムスタンプを異なるプロセス、異なる言語(Java、C、C#)、GNU/LinuxおよびWindows(少なくとも7つ)で比較する場合:
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ウィンドウ:
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;
}
私は質問がequivalentを要求することを知っていますが、私はこれらの2つを同じタスクに使用するので GetTickCount をスローします。懐かしいかもしれませんが、ティックを取得するために使用するのはSystem.currentTimeMillis()とGetTickCount()だけです。
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
// call
uint ticks = GetTickCount();