Миллисекунды в DateTime. Теперь на .NET Compact Framework всегда ноль? - PullRequest
13 голосов
/ 09 апреля 2010

Я хочу иметь отметку времени для журналов в проекте 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);
        }
    }
}

Ответы [ 5 ]

14 голосов
/ 09 апреля 2010

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 - это int, и через 25 дней это значение будет "округлено" до Int32.MinValue. Если ваше устройство будет работать так долго без перезапуска, вам нужно добавить проверку для значения Environment.TickCount, которое меньше последнего прочитанного значения, и сбросить значения _start и _startTick, если так. 1019 *

5 голосов
/ 09 апреля 2010
2 голосов
/ 09 апреля 2010
1 голос
/ 09 апреля 2010

Основной альтернативой является класс System.Diagnostics.Stopwatch.

Доступно в CE, но обратите внимание на свойство IsHighResolution. Возможно, на вашем устройстве установлено значение False, но проверьте.

Это так же точно, как вы получите без P / Invoke.

0 голосов
/ 22 марта 2011

В обычной среде v2.0 вы можете использовать DateTime.Now.ToString ("гггг-ММ-дд ЧЧ: мм: сс.ффф") для получения миллисекунд. Больше f означает большую точность.

...