Java'nın System.currentTimeMillis()C # ' daki karşılığı nedir ?
Yanıtlar:
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;
}
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.
C# give : 2688547veJava give : 1390707872687
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().
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffsetyöntem .Net 4.6'dan itibaren tanıtıldı.
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ı :)
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);
}
}
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.
İş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
Ç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.
Ben sadece çabaladığınız şeyi başarmanın en basit yolunu şu şekilde düşünüyorum:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
DateTime.UtcNowdaha iyi bir seçenek
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;
}
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();