我想为 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);
}
}
}
答案 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.TickCount
是int
,此值将在25天左右后“回绕”到Int32.MinValue
。如果您的设备将在没有重新启动的情况下运行那么长时间,那么您需要添加一个Environment.TickCount
值的检查,该值小于上次读取的值,并重置_start
和{{1如果是这样的话。
答案 1 :(得分:5)
答案 2 :(得分:2)
答案 3 :(得分:1)
主要替代方案是System.Diagnostics.Stopwatch类。
它在CE中可用,但请注意IsHighResolution
属性。它可能在您的设备上为假,但请检查。
如果没有P / Invoke,它就会很准确。
答案 4 :(得分:-3)
在常规框架v2.0中,您可以使用 DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss.fff”)来获得毫秒数。更多f表示更精确。