quiero tener una marca de tiempo para registros en un proyecto de Windows Mobile. La precisión debe estar en el rango de cien milisegundos al menos.Milisegundos en DateTime.Now en .NET Compact Framework siempre es cero?
Sin embargo, mi llamada a DateTime.Now
devuelve un objeto DateTime
con la propiedad Millisecond
establecida en cero. Además, la propiedad Ticks
se redondea en consecuencia.
¿Cómo obtener una precisión de tiempo mejor?
Recuerde que mi código se ejecuta en Compact Framework, versión 3.5. Uso un dispositivo HTC Touch Pro 2.
Sobre la base de la respuesta de MusiGenesis he creado la siguiente clase que solucionó este problema:
/// <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);
}
}
}
No es necesario volver a marcar su pregunta con "[SOLUCIONADO]". Puede ver que la pregunta tiene una respuesta aceptada en el contador de respuestas amarillas en la página principal o en los resultados de búsqueda. – spoulson
Como fuente de esto, debo mencionar que esta clase casi con certeza se "alejará" del valor devuelto por el 'DateTime.Now' regular, posiblemente hasta unos pocos segundos (o incluso mucho más) en el transcurso de un día.Puede probar esto simplemente configurando la propiedad _start de su clase, esperando un poco de tiempo (un día o lo que sea) y comparando 'DateTime.Now' con' DateTimePrecisely.Now'. – MusiGenesis
Si considera que la cantidad de deriva es inaceptable, puede agregar un método 'Restablecer 'que obtiene valores nuevos para' _start' y '_startTick', y llámelo periódicamente. Esto lo mantendrá sincronizado a largo plazo con el reloj del sistema y le dará (supuestamente) una resolución de milisegundos. O use el código 'ctacke'. – MusiGenesis