System.currentTimeMillis()
C#のJavaに相当するものは何ですか?
回答:
別の方法:
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の一般的なイディオムはcurrentTimeMillis()
、タイミングまたはスケジューリングの目的でforを使用することです。この場合、1970年以降の実際のミリ秒には関心がなく、代わりに相対値を計算し、その後の呼び出しcurrentTimeMillis()
をその値と比較します。
それがあなたが探しているものなら、C#の同等物はEnvironment.TickCount
です。
C# give : 2688547
およびJava give : 1390707872687
System.currentTimeMillis()
1970年以降のUTC時間をミリ秒単位でEnvironment.TickCount
返し、アプリの起動以降のミリ秒を返します。System.currentTimeMillis()
経過時間を確認するのに適していますが、2つの期間を比較したい場合は、を使用する必要がありますSystem.nanoTime()
。
System.currentTimeMillis()
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);
}
}
d
使用されていないことです。このコードを使用するには、次のように記述できます。var date = new DateTime(); var millis = date.currentTimeMillis();
ただし、date
変数は冗長であり、その状態は使用されません。オブジェクトの状態を使用しない場合、拡張メソッドを作成すると、コードが不明瞭になります。@Hathによって提供される答えは、より単純であり、したがって(私にとって)より良いものです。たぶん@JoelCoehoornは、メソッド本体ではd
なく値を使用することを意図していDateTime.UtcNow
ましたか?私は拡張メソッドをかなり頻繁に使用しますが、これには使用しません。
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
フレームワークには、1970年以降の古い秒(またはミリ秒)は含まれていません。最も近いのは、0001年1月1日からの100ナノ秒の数であるDateTime.Ticksです。
私はあなたが努力してきたことを達成するための最も簡単な方法を次のように考えています:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
DateTime.UtcNow
より良いオプションです
GNU / LinuxおよびWindows(少なくとも7つ)で、異なるプロセス、異なる言語(Java、C、C#)間でタイムスタンプを比較する場合:
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;
}
質問が同等のものを要求することは知っていますが、同じタスクにこれら2つを使用するため、GetTickCountをスローします。懐かしいかもしれませんが、ティックを取得するために使用するのはSystem.currentTimeMillis()とGetTickCount()だけです。
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
// call
uint ticks = GetTickCount();