Миллисекунды в DateTime.Now на .NET Compact Framework всегда равны нулю?
Я хочу иметь метку времени для журналов в проекте Windows Mobile. Точность должна составлять не менее ста миллисекунд.
Однако мой вызов DateTime.Now
возвращает объект DateTime
с свойством Millisecond
, равным нулю. Также свойство Ticks
округляется соответственно.
Как повысить точность времени?
Помните, что мой код работает на Compact Framework версии 3.5. Я использую устройство HTC touch Pro 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);
}
}
}
Ответы
Ответ 1
Environment.TickCount
вернет число миллисекунд, которое Windows (или Windows Mobile) было запущено с момента последней перезагрузки.
Чтобы использовать это, добавьте эти два переменных уровня формы в свой код:
private DateTime _start;
private int _startTick;
В вашей форме Загрузите событие, сделайте следующее:
private void Form1_Load(object sender, EventArgs e)
{
_start = DateTime.Now;
_startTick = Environment.TickCount;
}
Всякий раз, когда вам нужен объект DateTime с миллисекундами, сделайте следующее:
DateTime timeStamp =
_start.AddMilliseconds(Environment.TickCount - _startTick);
Environment.TickCount
- это int
, и это значение будет "обертываться" до Int32.MinValue
через 25 дней или около того. Если ваше устройство будет работать так долго без перезагрузки, вам нужно добавить проверку на значение Environment.TickCount
, которое меньше, чем последнее прочитанное значение, и reset как _start
, так и _startTick
, если это так.
Ответ 2
Эта статья о времени миллисекундного разрешения также может быть полезна.
Ответ 3
Как насчет Таймер высокого разрешения?
Ответ 4
Основной альтернативой является класс System.Diagnostics.Stopwatch.
Он доступен в CE, но обратите внимание на свойство IsHighResolution
. Вероятно, это False на вашем устройстве, но проверьте.
Это так же точно, как вы получите без P/Invoke.
Ответ 5
В обычной версии v2.0 вы можете использовать DateTime.Now.ToString( "yyyy-MM-dd HH: mm: ss.fff" ), чтобы получить miliseconds. Больше f означает большую точность.