簡體   English   中英

C#中的Java System.currentTimeMillis()等效

[英]Java System.currentTimeMillis() equivalent in C#

在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中常見的習慣用法是使用currentTimeMillis()進行計時或調度,你不會對自1970年以來的實際毫秒數感興趣,而是計算一些相對值並將currentTimeMillis()后續調用與該值進行比較。

如果這就是你要找的東西,那么C#等價物就是Environment.TickCount

如果您對TIMING感興趣,請添加對System.Diagnostics的引用並使用秒表。

例如:

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

java中的System.currentTimeMillis()返回從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);
    }
}

這是一種近似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
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

我只是考慮如何實現你一直在努力的最直接的方式如下:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

該框架不包括自1970年以來的舊秒(或毫秒)。您得到的最接近的是DateTime.Ticks,它是自0001年1月1日以來100納秒的數量。

如果你想在不同的進程,不同的語言(Java,C,C#)之間比較時間戳,在GNU / Linux和Windows下(至少七個):

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

我知道問題要求等價,但是因為我使用那些2來執行相同的任務,所以我會把它放在GetTickCount中 我可能懷舊,但System.currentTimeMillis()和GetTickCount()是我用來獲取刻度的唯一。

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

// call
uint ticks = GetTickCount();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM