Chcę mieć znacznik czasu dla dzienników na temat projektu Windows Mobile. Dokładność musi wynosić co najmniej sto milisekund.Milisekundy w DateTime.Now na .NET Compact Framework zawsze zero?
Jednak moje połączenie z DateTime.Now
zwraca obiekt DateTime
z ustawieniem właściwości Millisecond
na zero. Również właściwość Ticks
jest odpowiednio zaokrąglana.
Jak poprawić dokładność czasu?
Pamiętaj, że mój kod działa w Compact Framework, wersja 3.5. Używam urządzenia HTC touch Pro 2.
Na podstawie odpowiedzi z MusiGenesis Utworzono następujące klasy, która rozwiązała ten problem:
/// <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);
}
}
}
Nie trzeba ponownie podawać pytania słowem "[SOLVED]". Możesz powiedzieć, że pytanie ma akceptowaną odpowiedź przez żółty licznik odpowiedzi na pierwszej stronie lub w wynikach wyszukiwania. – spoulson
Jako źródło tego, powinienem wspomnieć, że ta klasa prawie na pewno "odpłynie" od wartości zwróconej przez zwykłą 'DateTime.Now', prawdopodobnie nawet o kilka sekund (lub nawet o wiele więcej) w trakcie dzień.Możesz to sprawdzić po prostu ustawiając właściwość klasy _start, czekając trochę czasu (dzień lub cokolwiek innego) i porównując 'DateTime.Now' do' DateTimePrecisely.Now'. – MusiGenesis
Jeśli uznasz, że wartość dryfu jest nie do zaakceptowania, możesz dodać metodę "Reset", która pobiera świeże wartości dla '_start' i' _startTick', i wywoływać ją okresowo. Pozwoli to na długoterminową synchronizację z zegarem systemowym, jednocześnie dając (rzekomo) milisekundową rozdzielczość. Lub użyj kodu 'ctacke'. – MusiGenesis