2010-04-09 4 views
13

나는 타임 스탬프가 Windows 모바일 프로젝트에 기록되도록하고 싶습니다. 정확도는 적어도 100 밀리 초 범위 내에 있어야합니다..NET Compact Framework에서 DateTime.Now의 밀리 초는 항상 0입니까?

그러나 DateTime.Now으로 전화하면 Millisecond 속성이 0으로 설정된 DateTime 개체가 반환됩니다. 또한 Ticks 속성은 그에 따라 반올림됩니다.

시간 정확도를 높이려면 어떻게해야합니까?
내 코드는 Compact Framework 버전 3.5에서 실행됩니다. HTC 터치 프로 2 장치를 사용합니다. 내가이 문제를 해결 다음 클래스를 생성 한 MusiGenesis에서 답변에 따라

:

/// <summary> 
/// A more precisely implementation of some DateTime properties on mobile devices. 
/// </summary> 
/// <devdoc>Tested on a HTC Touch Pro2.</devdoc> 
public static class DateTimePrecisely 
{ 
    /// <summary> 
    /// Remembers the start time when this model was created. 
    /// </summary> 
    private static DateTime _start = DateTime.Now; 
    /// <summary> 
    /// Remembers the system uptime ticks when this model was created. This 
    /// serves as a more precise time provider as DateTime.Now can do. 
    /// </summary> 
    private static int _startTick = Environment.TickCount; 

    /// <summary> 
    /// Gets a DateTime object that is set exactly to the current date and time on this computer, expressed as the local time. 
    /// </summary> 
    /// <returns></returns> 
    public static DateTime Now 
    { 
     get 
     { 
      return _start.AddMilliseconds(Environment.TickCount - _startTick); 
     } 
    } 
} 
+2

"[SOLVED]"로 질문의 제목을 다시 지정할 필요가 없습니다. 첫 페이지의 노란색 응답 카운터 또는 검색 결과를 통해 질문에 대답 할 수 있음을 알 수 있습니다. – spoulson

+2

이 소스는이 클래스가 일반 "DateTime.Now"에 의해 반환 된 값에서 거의 "벗어나", 아마도 몇 초 (또는 훨씬 더)까지 하루.클래스의 _start 속성을 설정하거나, 일정 시간 (하루 또는 그 이상)을 기다리고 'DateTime.Now'와'DateTimePrecisely.Now'를 비교하여이를 간단하게 테스트 할 수 있습니다. – MusiGenesis

+1

만약 드리프트 값을 받아 들일 수 없다면,'_start'와'_startTick'에 대한 새로운 값을 얻는'Reset' 메쏘드를 추가하고 주기적으로 호출 할 수 있습니다. 이렇게하면 시스템 시계와 장기간 동기화되며 밀리 초 해상도를 유지할 수 있습니다. 또는'ctacke'의 코드를 사용하십시오. – MusiGenesis

답변

14

Environment.TickCount은 마지막 재부팅 이후 Windows (또는 Windows Mobile)가 실행 된 시간 (밀리 초)을 반환합니다.

이를 사용하려면 코드에 두 폼 수준 변수를 추가 :

private DateTime _start; 
private int _startTick; 

를 폼의 Load 이벤트에서 다음을 수행하십시오

private void Form1_Load(object sender, EventArgs e) 
{ 
    _start = DateTime.Now; 
    _startTick = Environment.TickCount; 
} 

당신이 밀리 초와 DateTime 개체를 필요로 할 때마다 다음을 수행하십시오

DateTime timeStamp = 
    _start.AddMilliseconds(Environment.TickCount - _startTick); 

Environment.TickCount이입니다 이 값은 25 일 정도 후에 Int32.MinValue으로 "랩 어라운드"됩니다. 장치를 다시 시작하지 않고 오래 실행하려면, 읽은 마지막 값보다 작은 Environment.TickCount 값에 대한 검사를 추가하고 _start_startTick을 모두 다시 설정해야합니다.

+0

+1. 이것은 트릭을했다. 마이크로 소프트 (또는 HTC?)가 자신의 코드에서 그렇게하지 않는 것은 나쁘다. – Marcel

+3

HTC가 실패한 것이지 Microsoft의 것이 아닙니다. 운영 체제에 시간을 제공하는 것은 OEM에게 달려 있습니다. – ctacke

+0

제발 좀 도와주세요. 정확도가 더 높은 시간을 어떻게 돌려 줄지 알려주세요. 시작 시간에는 이미 초의 부분이 포함되어 있지 않으므로 "더 많은 숫자"를 갖지만 그게 전부입니다. 따라서 "허수"숫자를 추가하는 것입니다. 로그에서 사용되는 경우 로그 항목 사이의 경과 시간을 볼 수는 있지만 다른 시스템 시간과 비교할 수는 없습니다. – HoGo

1

주요 대안은 System.Diagnostics.Stopwatch 클래스입니다.

CE에서 사용할 수 있지만 IsHighResolution 속성에 유의하십시오. 그것은 아마도 귀하의 장치에 거짓이지만 확인하십시오.

P/Invoke없이 얻는 것만 큼 정확합니다.

2

High Resolution Timer은 어떻게됩니까?

+0

+1에 대한 힌트. 그러나 이것이 내 정확성을 뛰어 넘습니다 (긍정적 인 의미에서) – Marcel

-3

일반 프레임 워크 v2.0에서는 DateTime.Now.ToString ("yyyy-MM-dd HH : mm : ss.fff")을 사용하여 밀리 초를 얻을 수 있습니다. f가 클수록 정확도가 높아집니다.

+0

CF에서는 사실이 아닙니다. 질문에 대한 다른 답변을 참조하십시오. – ctacke