.NET Compact Framework上的DateTime.Now中的毫秒数始终为零?

时间:2010-04-09 09:31:58

标签: c# datetime windows-mobile compact-framework timestamp

我想为 Windows Mobile项目上的日志提供时间戳。精度必须至少在100毫秒的范围内。

但是,我对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 个答案:

答案 0 :(得分: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.TickCountint,此值将在25天左右后“回绕”到Int32.MinValue。如果您的设备将在没有重新启动的情况下运行那么长时间,那么您需要添加一个Environment.TickCount值的检查,该值小于上次读取的值,并重置_start和{{1如果是这样的话。

答案 1 :(得分:5)

答案 2 :(得分:2)

High Resolution Timer怎么样?

答案 3 :(得分:1)

主要替代方案是System.Diagnostics.Stopwatch类。

它在CE中可用,但请注意IsHighResolution属性。它可能在您的设备上为假,但请检查。

如果没有P / Invoke,它就会很准确。

答案 4 :(得分:-3)

在常规框架v2.0中,您可以使用 DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss.fff”)来获得毫秒数。更多f表示更精确。