C #에서 Java System.currentTimeMillis ()에 해당


85

System.currentTimeMillis()C #에서 Java와 동등한 것은 무엇입니까 ?


궁금한 점은 1970 년 이후로 밀리가 필요한 이유는 무엇입니까?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

답변:


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

74

자바의 일반적인 관용구는 currentTimeMillis()1970 년 이후의 실제 밀리 초에 관심이없는 타이밍 또는 스케줄링 목적으로 를 사용하는 것 입니다. 대신에 상대적인 값을 계산하고 나중에 해당 값과 비교 currentTimeMillis()합니다.

그것이 당신이 찾고있는 것이라면 C #에 해당하는 것은 Environment.TickCount.


1
그러나 둘 다 차이 숫자를 제공합니다. 어떻게 올바르게 비교합니까 ?? C# give : 2688547Java give : 1390707872687
엘스

1
@Elshan 당신은 그들을 비교할 수 없습니다. 그들은 다른 진드기입니다. 이 기술은 응용 프로그램 전체가 아닌 응용 프로그램 내에서 타이밍 및 스케줄링을위한 것입니다.
Barend

System.currentTimeMillis()1970 년 이후 UTC 시간 (ms)을 Environment.TickCount반환하고 앱 시작 이후 ms 를 반환합니다. System.currentTimeMillis()경과 시간을 확인하는 데 유용하지만 두 기간을 비교하려면을 사용해야합니다 System.nanoTime().
michelpm

12

타이밍에 관심이있는 경우 System.Diagnostics에 대한 참조를 추가하고 스톱워치를 사용하십시오.

예를 들면 :

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


7

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로 만들었습니다. :)


4
DateTime.Now는 UTC가 아닌 현지 시간을 사용합니다. 로컬에서 알 수없는 종류의 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

1
@mortb 확장 방법입니다. 이것이 클래스를 수정하지 않고 클래스에 "메서드를 추가"하도록 C #에서 정의되는 방법입니다. 컴파일러는 메서드를 해석하여 클래스 자체의 인스턴스 메서드 인 것처럼 "this"매개 변수의 인스턴스에 적용 할 수 있습니다. 정적 클래스의 메서드와 동일하게 작동하지만 컴파일러를 사용하면 더 쉬운 대체 구문을 작성할 수 있습니다.
Suncat2000

1
문제는 매개 변수의 값이 d사용되지 않는다는 것입니다. 이 코드를 사용하려면 작성할 수 있습니다. var date = new DateTime(); var millis = date.currentTimeMillis();그러나 date변수는 중복되고 그 상태는 사용되지 않습니다. 객체의 상태를 사용하지 않을 때 확장 메서드를 생성하면 코드가 가려집니다. @Hath가 제공하는 대답은 더 간단하므로 (나에게) 더 좋습니다. @Joel Coehoorn 이 메서드 본문 d대신 값을 사용하려고 DateTime.UtcNow했습니까? 나는 확장 방법을 꽤 많이 사용하지만 이것에는 사용하지 않습니다.
mortb

날짜를 사용하지 않는 확장을 만드는 이유는 무엇입니까? 나는이 코드를 사용했고 그것은 나를 잡았다. 올바른 버전은 다음과 같습니다. return (long) ((d.ToUniversalTime ()-Jan1st1970) .TotalMilliseconds);
Mark G

4

다음은 Unix 타임 스탬프를 근사화하는 간단한 방법입니다. UTC를 사용하는 것은 유닉스 개념에 더 가깝고 은밀해야 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

정확히 내가 필요한 것.
Ajibola 2014 년

3

프레임 워크는 1970 년 이후의 이전 초 (또는 밀리 초)를 포함하지 않습니다. 가장 가까운 값은 0001 년 1 월 1 일 이후 100 나노초 수인 DateTime.Ticks입니다.


1
(DateTime.Ticks / 10000000)-(0001과 1970 사이의 초 수)가 정확한 답을 제공할까요?
Liam

3

나는 당신이 노력해 온 것을 달성하는 가장 직접적인 방법을 다음과 같이 고려합니다.

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNow더 나은 옵션입니다
메디 Khademloo

2

GNU / Linux 및 Windows (최소 7 개)에서 서로 다른 프로세스, 서로 다른 언어 (Java, C, C #)간에 타임 스탬프를 비교하려는 경우 :

씨#:

private static long nanoTime() {
   long nano = 10000L * Stopwatch.GetTimestamp();
   nano /= TimeSpan.TicksPerMillisecond;
   nano *= 100L;
   return nano;
}

자바:

java.lang.System.nanoTime();

C GNU / 리눅스 :

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

나는 질문이 동등한 것을 요구 한다는 것을 알고 있지만 GetTickCount 에서 던지는 동일한 작업에 대해 그 2를 사용하기 때문에 . 향수를 불러 일으킬 수도 있지만 System.currentTimeMillis () 및 GetTickCount ()는 진드기를 얻는 데 사용하는 유일한 것입니다.

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

// call
uint ticks = GetTickCount();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.