Java System.currentTimeMillis() эквивалент в С#

Что такое эквивалент Java System.currentTimeMillis() в С#?

Ответ 1

Альтернатива:

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

Общей идиомой в Java является использование currentTimeMillis() для целей синхронизации или планирования, где вы не интересуетесь фактическими миллисекундами с 1970 года, но вместо этого вычисляете некоторое относительное значение и сравниваете последующие вызовы currentTimeMillis() с тем, что значение.

Если это то, что вы ищете, эквивалент С# Environment.TickCount.

Ответ 3

Мы также можем немного притворяться и сделать это как метод расширения, чтобы он зависал с классом 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);
    }
}

Ответ 4

Если вы заинтересованы в TIMING, добавьте ссылку на System.Diagnostics и используйте секундомер.

Например:

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

Ответ 5

System.currentTimeMillis() в java возвращает текущее время в миллисекундах с 1/1/1970

С#, который будет

public static double GetCurrentMilli()
    {
        DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc);
        TimeSpan javaSpan = DateTime.UtcNow - Jan1970;
        return javaSpan.TotalMilliseconds;
    }

edit: сделал utc, как было предложено:)

Ответ 6

Вот простой способ аппроксимировать временную метку 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

Ответ 7

Структура не включает старые секунды (или миллисекунды) с 1970 года. Ближе всего вы получаете DateTime.Ticks, число которых составляет 100-наносекунд с 1 января 0001 года.

Ответ 8

Я просто рассматриваю наиболее простой способ, как добиться того, к чему вы стремились, следующим образом:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

Ответ 9

Я знаю, что вопрос задает эквивалент, но поскольку я использую эти 2 для тех же задач, я бросаю GetTickCount. Я мог бы быть ностальгическим, но System.currentTimeMillis() и GetTickCount() являются единственными, которые я использую для получения тиков.

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

// call
uint ticks = GetTickCount();

Ответ 10

Если вы хотите сравнить временную метку между различными процессами, разными языками (Java, C, С#), в GNU/Linux и Windows (по крайней мере семь):

С#:

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