C#で同等のJava System.currentTimeMillis()


85

System.currentTimeMillis()C#のJavaに相当するものは何ですか?


ただ好奇心が強いのですが、なぜ1970年以来ミリが必要なのですか?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
ラムナス2018年

回答:


90

別の方法:

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
「DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()」と同じ結果
Ramunas 2018年

74

Javaの一般的なイディオムはcurrentTimeMillis()、タイミングまたはスケジューリングの目的でforを使用することです。この場合、1970年以降の実際のミリ秒には関心がなく、代わりに相対値を計算し、その後の呼び出しcurrentTimeMillis()をその値と比較します。

それがあなたが探しているものなら、C#の同等物はEnvironment.TickCountです。


1
しかし、それらは両方とも異なる数を与えます。それらはどのように正しく比較されますか?C# give : 2688547およびJava give : 1390707872687
Elshan 2014年

1
@Elshanあなたはそれらを比較することはできません。それらは異なるダニです。この手法は、アプリケーション間ではなく、アプリケーション内でのタイミングとスケジューリングを目的としています。
Barend 2014年

System.currentTimeMillis()1970年以降のUTC時間をミリ秒単位でEnvironment.TickCount返し、アプリの起動以降のミリ秒を返します。System.currentTimeMillis()経過時間を確認するのに適していますが、2つの期間を比較したい場合は、を使用する必要がありますSystem.nanoTime()
michelpm 2015

12

TIMINGに関心がある場合は、System.Diagnosticsへの参照を追加し、ストップウォッチを使用してください。

例えば:

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


7

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にしました:)


4
DateTime.Nowは、UTCではなく現地時間を使用します。ローカルのDateTimeから未知の種類のDateTimeを減算するとどうなるかは正確にはわかりませんが、両方をUTCに設定することをお勧めします:)
Jon Skeet

7

また、少し凝ったものを拡張メソッドとして実行して、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
これは少し間違っていませんか?この拡張メソッドはDateTimeの任意のインスタンスに渡されますが、インスタンスは使用しません。紛らわしいようです...使用しないパラメータは必要ないと思います
mortb 2014

1
@mortbこれは拡張メソッドです。これが、クラスを変更せずにクラスに「メソッドを追加」することがC#で定義される方法です。コンパイラはメソッドを解釈し、それをクラス自体のインスタンスメソッドであるかのように「this」パラメータのインスタンスに適用できます。静的クラスのメソッドとまったく同じように機能しますが、コンパイラーを使用すると、より簡単な代替構文を記述できます。
Suncat20 0019

1
問題は、パラメータの値がd使用されていないことです。このコードを使用するには、次のように記述できます。var date = new DateTime(); var millis = date.currentTimeMillis();ただし、date変数は冗長であり、その状態は使用されません。オブジェクトの状態を使用しない場合、拡張メソッドを作成すると、コードが不明瞭になります。@Hathによって提供される答えは、より単純であり、したがって(私にとって)より良いものです。たぶん@JoelCoehoornは、メソッド本体ではdなく値を使用することを意図していDateTime.UtcNowましたか?私は拡張メソッドをかなり頻繁に使用しますが、これには使用しません。
mortb

日付を使用しない拡張機能を作成するのはなぜですか?私はこのコードを使用しました、そしてそれは私を捕らえました。正しいバージョンは次のとおりです。return(long)((d.ToUniversalTime()-Jan1st1970).TotalMilliseconds);
マークG

4

Unixタイムスタンプを概算する簡単な方法は次のとおりです。UTCを使用すると、UNIXの概念に近い、あなたがから転化する必要があるdoublelong

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

まさに私が必要なもの。
アジボラ2014年

3

フレームワークには、1970年以降の古い秒(またはミリ秒)は含まれていません。最も近いのは、0001年1月1日からの100ナノ秒の数であるDateTime.Ticksです。


1
(DateTime.Ticks / 10000000)-(0001から1970までの秒数)は正確な答えを出しますか?
リアム

3

私はあなたが努力してきたことを達成するための最も簡単な方法を次のように考えています:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowより良いオプションです
Mehdi Khademloo 2017

2

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;
}

1

質問が同等のものを要求することは知っていますが、同じタスクにこれら2つを使用するため、GetTickCountをスローします。懐かしいかもしれませんが、ティックを取得するために使用するのはSystem.currentTimeMillis()とGetTickCount()だけです。

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

// call
uint ticks = GetTickCount();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.