C # Java System.currentTimeMillis () eşdeğeri


86

Java'nın System.currentTimeMillis()C # ' daki karşılığı nedir ?


Merak ediyorum, 1970'den beri neden milislere ihtiyacınız var?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Yanıtlar:


90

Bir alternatif:

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 ()" ile aynı sonuç
Ramunas

75

Java'daki yaygın bir deyim, currentTimeMillis()1970'den beri gerçek milisaniyelerle ilgilenmediğiniz, ancak bunun yerine bazı göreli değerleri hesaplayıp sonraki çağrıları currentTimeMillis()bu değerle karşılaştırdığınız zamanlama veya zamanlama amacıyla kullanmaktır .

Aradığınız şey buysa, C # eşdeğeri Environment.TickCount.


1
Ama ikisi de fark sayıları veriyor, nasıl doğru karşılaştırıyorlar ?? C# give : 2688547veJava give : 1390707872687
Elshan

1
@Elshan Onları karşılaştıramazsınız. Farklı keneler. Bu teknik, uygulamalar arasında değil, bir uygulama içinde zamanlama ve zamanlama içindir.
Barend

System.currentTimeMillis()1970'ten beri UTC saatini ms cinsinden Environment.TickCountdöndürürken, uygulama başladığından beri ms değerini döndürür. System.currentTimeMillis()geçen süreyi kontrol etmek için iyidir, ancak iki sürenin karşılaştırılabilir olmasını istiyorsanız kullanmanız gerekir System.nanoTime().
michelpm

12

ZAMANLAMA ile ilgileniyorsanız, System.Diagnostics'e bir referans ekleyin ve bir Kronometre kullanın.

Örneğin:

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

8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

Bu DateTimeOffsetyöntem .Net 4.6'dan itibaren tanıtıldı.
Suncat2000

7

System.currentTimeMillis()java 1.1.1970 den milisaniye geçerli saati döndürür

c # olurdu

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

düzenleme: önerildiği gibi utc yaptı :)


4
DateTime.Now UTC değil yerel saati kullanır. Bilinmeyen türde bir DateTime'ı yerel bir taneden çıkardığınızda tam olarak ne olacağını bilmiyorum, ancak ikisini de UTC'ye ayarlamak en iyisidir :)
Jon Skeet

7

Ayrıca biraz süslü olabilir ve bunu bir uzantı yöntemi olarak yapabiliriz, böylece DateTime sınıfını kapatır:

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
Bu biraz yanlış değil mi? Bu uzantı yöntemi, herhangi bir DateTime örneğine teslim eder , ancak örneği kullanmaz. Sadece kafa karıştırıcı görünüyor ...
Kullanmadığınız

1
@mortb Bu bir genişletme yöntemidir. Sınıfı değiştirmeden bir sınıfa "yöntem eklemek" için C # 'da bu şekilde tanımlanır. Derleyici, yöntemi yorumlar ve "this" parametresinin bir örneğine, sınıfın kendisinde bir örnek yöntemiymiş gibi uygulayabilir. Statik sınıftaki bir yöntemle aynı işlevi görür, ancak derleyici daha kolay, alternatif bir sözdizimi yazmaya izin verir.
Suncat2000

1
Sorun, parametrenin değerinin dkullanılmamasıdır. Bu kodu kullanmak için yazabilirsiniz var date = new DateTime(); var millis = date.currentTimeMillis();Ama datedeğişken sadece fazlalık olur ve durumu asla kullanılmaz. Nesnenin durumu kullanılmadığında, bir uzantı yöntemi oluşturmak yalnızca kodu gizler. @Hath tarafından sağlanan cevap daha basittir ve bu nedenle (benim için) daha iyidir. Belki @Joel Coehoorn , yöntem gövdesi dyerine değeri kullanmayı amaçladı DateTime.UtcNow? Uzatma yöntemlerini çok kullanıyorum ama bunun için değil.
mortb

Neden tarihi kullanmayan bir uzantı oluşturdunuz? Bu kodu kullandım ve beni yakaladı. Doğru sürüm: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G

4

İşte Unix zaman damgasını tahmin etmenin basit bir yolu. UTC kullanarak unix kavramına daha yakın olduğunu ve gelen gizli gerekiyor doubleiçin 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);

baskılar:

millis=1226674125796

tam olarak ihtiyacım olan şey.
Ajibola

3

Çerçeve 1970'ten beri eski saniyeleri (veya milisaniyeleri) içermiyor. En yakın aldığınız DateTime.Ticks, 1 Ocak 0001'den bu yana 100 nanosaniye sayısıdır.


1
(DateTime.Ticks / 10000000) - (0001 ile 1970 arasındaki saniye sayısı) doğru bir cevap verir mi?
Liam

3

Ben sadece çabaladığınız şeyi başarmanın en basit yolunu şu şekilde düşünüyorum:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowdaha iyi bir seçenek
Mehdi Khademloo

2

GNU / Linux ve Windows (en az yedi) altında farklı işlemler, farklı diller (Java, C, C #) arasında bir zaman damgasının karşılaştırılmasını istiyorsanız:

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

1

Sorunun eşdeğer istediğini biliyorum ama bu 2'yi GetTickCount'a attığım görevler için kullandığım için . Nostaljik olabilirim ama System.currentTimeMillis () ve GetTickCount (), keneler almak için kullandığım tekler.

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

// call
uint ticks = GetTickCount();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.