밀리 초 정밀도로 DateTime.Now를 가져옵니다.


231

밀리 초 정밀도로 실제 시간의 타임 스탬프를 정확히 어떻게 구성 할 수 있습니까?

16.4.2013 9 : 48 : 00 : 123과 같은 것이 필요합니다. 이게 가능해? 초당 10 번 값을 샘플링하는 응용 프로그램이 있으며 그래프로 표시해야합니다.



많은 답변이 hh몇 시간 (표준 시간) 동안 사용된다는 점에 유의하십시오 . 타임 스탬프 (및 다른 많은 경우)의 경우 아마도 tt(am / pm) 와 쌍을 이루 거나 HH(군사적 시간)으로 대체되어야 합니다.
wentz

답변:


304

밀리 초 정밀도로 실제 시간의 타임 스탬프를 정확히 어떻게 구성 할 수 있습니까?

나는 당신이 밀리 초의 정확성 을 의미한다고 생각합니다 . DateTime정밀도는 높지만 정확도 측면에서는 상당히 굵습니다. 일반적으로 말하면 할 수 없습니다. 일반적으로 시스템 클럭 ( DateTime.Now데이터를 가져 오는 위치 )의 해상도는 약 10-15ms입니다. 자세한 내용 은 정확성과 정확성대한 Eric Lippert의 블로그 게시물 을 참조하십시오.

이보다 정확한 타이밍이 필요한 경우 NTP 클라이언트를 사용하는 것이 좋습니다.

그러나 여기에 밀리 초 정확도가 실제로 필요한지는 확실하지 않습니다. 정확한 타이밍에 신경 쓰지 않는다면 "정확하게"정확한 정확도로 샘플을 올바른 순서로 보여 주기만하면 시스템 시계가 양호해야합니다. 일광 절약 전환 등과 같은 시간대 문제를 피하기 위해 DateTime.UtcNow오히려 오히려 사용하는 것이 좋습니다 DateTime.Now.

귀하의 질문이 실제로DateTime 밀리 초 정밀도의 문자열로 변환하는 것과 관련 이 있다면 다음 을 사용하는 것이 좋습니다.

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

(샘플과 달리이 방법은 정렬 가능하며 "월 / 일 / 년"또는 "일 / 월 / 년"인지 여부에 대해 혼동을 일으킬 가능성이 적습니다.)


5
@antonio : "작동하지 않습니다"라는 정보만으로는 더 이상 도움을 줄 수 없습니다.
Jon Skeet

예, 추가 정보를 제공 할 수 있습니다 : "{0 : yyyyMMdd HH : mm : ss.fff}", DateTime.UtcNow-> 20180502 11 : 07 : 20.000 Win32.GetSystemTime (ref stime)-> 2018,2,5,11 , 7,20,0 (ymdh mm ss ms) 밀리 초로 날짜 시간 인스턴스를 만들 수 있습니다. var dt = new DateTime (2018, 5, 2, 19, 34, 55, 200); "{0 : yyyyMMdd HH : mm : ss.fff}", dt-> 20180502 19 : 34 : 55.200 .Net 콤팩트 프레임 워크, Windows Embedded Compact 7, ARM Cortex-A8
Antonio

@ Antonio : 따라서 사용중인 하드웨어에서 사용하는 .NET 버전이 1 초 미만의 정확도를 제공하지 않거나 두 번째 경계에서 호출 한 것처럼 들립니다. (당신이 타격을 계속하면 DateTime.UtcNow? 반복, 그것은 오직 초당 후에는 것을 보여 않았다 증가한다.)
존 소총

DateTime에서 Ticks를 검색하면 값이 잘립니다 : Ticks 636534596580000000 DateTime from Ticks 20180205 20 : 34 : 18.000. 한계는 하드 / 소프트웨어에 있다고 생각합니다. 내가 스톱워치 클래스를 사용하여 한 대신 감사 존
안토니오

@ Antonio :이 시점에서 관련된 장치에 대한 자세한 내용으로 새로운 질문을 작성하는 것이 좋습니다.
Jon Skeet

117

이것은 작동해야합니다 :

DateTime.Now.ToString("hh.mm.ss.ffffff");

표시 할 필요가없고 시차를 알아야 할 경우 문자열로 변환하지 마십시오. 그대로 두십시오.DateTime.Now();

그리고 TimeSpan시간 간격의 차이를 아는 데 사용 하십시오.

DateTime start;
TimeSpan time;

start = DateTime.Now;

//Do something here

time = DateTime.Now - start;
label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0'));

나는 그것을 계산해야하므로 문자열로 변환 할 수 없습니다.
LuckyHK

25

나는이 스레드에서 제안 된 것을 기반으로 비슷한 솔루션을 찾고 있었고 다음을 사용하며 DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff") 매력처럼 작동합니다. 참고 : .fff캡처하려는 정밀도 숫자입니다.


1
날짜가 오후 (4PM)이면 오전과 같이 표시됩니다. FIX : 사용 HH(군사 시간) 또는 추가 tt(PM 또는 AM) 이 예에서 볼 수 있듯이 : repl.it/KGr3/1
Jaider

22

밀리 초와 함께 DateTime 구조를 사용하고 다음과 같은 형식을 사용하십시오.

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");

16

파이 로맨 서의 대답 은 나에게 꽤 좋아 보이지만 아마도 당신은 원했을 것입니다.

DateTime.Now.Millisecond

그러나 날짜를 비교하는 경우 TimeSpan을 사용하는 것이 좋습니다.


15
참고 : 두 DateTime의 차이를 TimeSpan으로 비교하려면 필요합니다 TotalMilliseconds. 밀리 초는 현재 밀리 초 카운터를 유지하며 1000보다 크지 않으며 TotalMilliseconds는 에포크 이후 경과 된 총 밀리 초를 유지합니다.
Contango

4

다른 답변과 같은 문자열 대신 날짜를 원한다면이 확장 방법을 추가하십시오.

public static DateTime ToMillisecondPrecision(this DateTime d) {
    return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute,
                        d.Second, d.Millisecond, d.Kind);
}

3

내가 질문을 이해하는 한, 당신은 갈 수 있습니다 :

DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

이렇게하면 1 밀리 초보다 작은 틱이 차단됩니다.


예, 그러나 DateTime.Now의 실제 해상도는 약 16ms를 초과 할 수 없습니다.
Peter Mortensen

2

의 문제점 DateTime.UtcNowDateTime.Now그 시스템을 컴퓨터에 따라 동작하고, 그것이 10 내지 15 밀리 정확할 수도있다. 그러나 Windows 컴퓨터에서는 낮은 수준의 기능 GetSystemTimePreciseAsFileTime 을 사용하여 마이크로 초 정확도를 얻을 수 있습니다 ( GetTimeStamp()아래 기능 참조).

    [System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")]
    static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct FileTime  {
        public const long FILETIME_TO_DATETIMETICKS = 504911232000000000;   // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7
        public uint TimeLow;    // least significant digits
        public uint TimeHigh;   // most sifnificant digits
        public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } }     // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32
        public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } }
    }

    public static DateTime GetTimeStamp() { 
        FileTime ft; GetSystemTimePreciseAsFileTime(out ft);
        return ft.dateTime;
    }

정말 고맙습니다. 나는 이것을 오랫동안 오랫동안 찾고 있었다. 성능 문제가 발생하고 프로덕션 코드를 사용하는 것이 안전합니까?
Muhammet Göktürk Ayan


-2
public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

당신이 마이크로를 원한다면, 단지 변화 1000010, 당신은 마이크로의 10를 원하는 경우, 삭제합니다 / 10000.


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