C #을 사용하여 밀리 초 단위로 시간 가져 오기


131

밀리 초 단위로 시간을 가져야하는 프로그램을 만들고 있습니다. 시간이 지남에 따라, 나는 결코 자신과 같지 않은 숫자를 의미하며, 항상 2 초 전보다 1000 숫자가 더 큽니다. 나는 DateTime.Nowa 로 변환 TimeSpan하고 TotalMilliseconds그로부터 얻는 것을 시도했지만 ... 완전히 정확하지 않다고 들었습니다.

더 쉬운 방법이 있습니까?


두 번의 통화로 항상 가치가 높아질 것으로 기대하십니까? 일반적으로 타이머 해상도가 허용하는 최소 간격보다 가까운 통화는 동일한 값을 생성합니다. 가짜 정밀 직렬 변환기 형태로 자체 타이 브레이커를 추가해야합니다.
— Steven Sudit

16
"그 자체와 절대 같지 않은 숫자". 복잡해 보입니다. ;)
— Mizipzor

1
NaN은 실제로 그 요구 사항에 맞습니다. "숫자가 아님"에도 불구하고, 그것은 숫자 유형이며 그 자체와 같지 않습니다.
— Yay295

답변:


78

Stopwatch수업을 사용하십시오 .

경과 시간을 정확하게 측정하는 데 사용할 수있는 일련의 방법 및 속성을 제공합니다.

그것을 구현하는 좋은 정보가 있습니다 :

성능 테스트 : System.Diagnostics.Stopwatch를 사용한 정확한 런타임 측정


8
스톱워치는 진단의 일부입니다. 실제 코드에서 사용해야합니까?
— Andrey


이것은 일반적으로 가장 가까운 15ms 정도만 정확합니다.
— Steven Sudit

11
그래도 얼마나 비쌉니까? 아마도 우리는 스톱워치를 스톱워치해야합니다 :)
— jb.

3
@Steven은 OS와 기본 하드웨어에 따라 다릅니다. 사용 가능한 경우 고해상도 타이머가 사용되는데, 이는 내가 알고있는 모든 현재 데스크탑 및 서버 기반 x86 Windows 버전의 경우입니다. 자세한 내용은 Frequency 및 IsHighResolution 속성을 확인하십시오. OS 수준에서 QueryPerformanceCounter 및 QueryPerformanceFrequency는이 기능을 지원하는 저수준 API입니다.
— Chris Taylor

320
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

이것은 실제로 다양한 유닉스 변환 방법이 DateTimeOffset클래스 (.NET Framework 4.6+, .NET Standard 1.3+) 에서 구현되는 방법입니다 .

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

65
제목은 "밀리 초 단위로 시간을받습니다". 이 답변이 도움이됩니다.
— 항공 우주

33
네, 제기 된 질문에 대한 답변을 찾고있는 사람들에게 이것은 매우 도움이되었습니다. 감사합니다.
— user430788

1
소수를 원한다면 ( DateTime.Now매우 자주 업데이트되지 않더라도 ) decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;대신 사용하십시오.
— Jeppe Stig Nielsen

1
이것은 검색 결과 및 원래 질문에서 수집 한 내용에 대해 선택된 답변보다 훨씬 유용합니다.
— bwoogie

1
이 대답은 내 생명을 구했습니다. 비슷한 코드가 있지만 작동하지 않습니다. 이유를 알 수 없습니다. 그런 다음 long밀리 초 앞에서 데이터 유형을 보았습니다 . int확실히 오버플로를 사용 합니다.
— FisNaN

13

이 DateTime.Ticks속성은 날짜와 시간을 나타내는 눈금 수를 가져옵니다.

10,000 Ticks는 밀리 초 (초당 10,000,000 틱)입니다.


4
그러나 진드기의 해상도가 매우 적은 1 / 젯 10000s, 어쩌면 1 / 62S보다
— codymanix

2
@codymanix-MSDN :A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.
— Itay Karo

5
물론입니다. 그러나 운영 체제의 해상도가 정확하지 않습니다.
— codymanix

6
@codymanix가 맞습니다. 유사하게, 옹스트롬은 길이의 단위입니다. 100 억 옹스트롬은 1 미터를 만듭니다. 높이를 옹스트롬 단위로 64 비트 정수로보고하는 함수를 작성할 수 있지만, 모든 것이 센티미터에 정확한 미터라면, 함수가 나노 미터 이하의 정밀도를 나타내는 사실은 완전히 관련이 없습니다. 덜 중요한 숫자는 쓰레기가 될 것입니다.
— Eric Lippert

4
@RedFilter : 나이를 가장 가까운 밀리 초로 알고 있다면 "다시 깜박하면 내 나이는 x 밀리 초가됩니다."와 같은 말을 할 수 있습니다. 더 큰 문제는 의사 소통이 아니라 측정입니다. 여러분의 출생은 가장 가까운 초조차 알려져 있지 않을 것입니다.
— Steven Sudit

11

나는 다음 수업을 사용합니다. 나는 인터넷에서 그것을 한 번 발견했는데, 지금 은 최고의 NOW () 이라고 가정했다 .

/// <summary>Class to get current timestamp with enough precision</summary>
static class CurrentMillis
{
    private static readonly DateTime Jan1St1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    /// <summary>Get extra long current timestamp</summary>
    public static long Millis { get { return (long)((DateTime.UtcNow - Jan1St1970).TotalMilliseconds); } }
}

출처를 알 수 없습니다.


5
이 일반적으로 사용되는 스 니펫의 전체 요점 인 FWIW는 Unix 타임 스탬프 표준과 호환되는 타임 스탬프를 만드는 것입니다. 이를 위해서는 매우 중요합니다. 타이밍을 원한다면 불필요하게 비쌉니다.
— ToolmakerSteve

8

QueryPerformanceCounter기본 방법을 시도해 볼 수 있습니다 . 자세한 내용은 http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html 을 참조하십시오. 이것이 Stopwatch클래스가 사용하는 것입니다.

.NET / C #에서 틱 정밀도의 타임 스탬프를 얻는 방법을 참조하십시오 . 자세한 내용은.

Stopwatch.GetTimestamp() 이 방법에 대한 액세스를 제공합니다.

public static long GetTimestamp() {
     if(IsHighResolution) {
         long timestamp = 0;
         SafeNativeMethods.QueryPerformanceCounter(out timestamp);
         return timestamp;
     }
     else {
         return DateTime.UtcNow.Ticks;
     }
 }

1
AFAIK 스톱워치는 QueryPerformanceCounter에 내부적 경우 사용 가능
— codymanix

그러나 내부 구현은 Stopwatch.GetTimestamp()실제로 해당 방법에 대한 액세스를 제공합니다.
— Pieter van Ginkel 16:25의

5

DateTime.Now.TimeOfDay.TotalMilliseconds (현재 날짜)를 사용했는데 도움이되기를 바랍니다.


1
TimeOfDay가 매일 자정에 0으로 재설정되므로 증가하는 값 (원래 포스터 필요에 따라)을 반환하지 않습니다. 또한 DateTime을 사용할 때 포스터에서 언급 한 것과 동일한 잠재적 인 문제가 있습니다. 지금은 총 밀리 초를 얻습니다.
— Jim O'Neil

3
Jim O'Neil 나는 u에 동의합니다. 그래서 나는 내 게시물에 "(현재 날짜)"라고 언급했습니다 ... 카운터로 사용되는 밀리 초 부분이므로 여기에 게시했습니다. 나는 여기에 처음이므로 잘못된 곳에 게시했다면 죄송합니다 :)
— Sarvan

2

사용하십시오 System.DateTime.Now.ToUniversalTime(). 이렇게하면 판독 값이 알려진 기준 기반 밀리 초 형식으로 변경되어 일 변경 등을 완전히 제거 할 수 있습니다.


알고있는 것이 좋지만 시간을 정확하게 전달하는 것이 아니라 타이밍 (시간 경과 측정)에 관한 질문과 관련이 없습니다.
— ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.