WinCE下使用C#获得带毫秒的DateTime.Now
在WinCE下,使用DateTime.Now获取的系统时间是不带毫秒的,如果想要它带毫秒,需要耍点手段。话不多说,直接上代码:
public static DateTimePrecisely { //定义一个全局变量,用来保存一个毫秒的0点。 private static int m_offset = 0; static DateTimePrecisely() { int s = DateTime.Now.Second;
//我们需要等待一次跨秒,来定义毫秒的0点。 while (true) { int s2 = DateTime.Now.Second; //一旦跨秒,就立刻把这个余数记录下来。 if (s != s2) { m_offset = Environment.TickCount % 1000; break; } } } public static DateTime Now { get { // 获取系统当前的毫秒数 int tick = Environment.TickCount % 1000; // 考虑两种情况,一种是当前毫秒数大于0点,一种是小于0点,两者算法是不一样的,要注意 int ms = (tick >= m_offset) ? (tick - m_offset) : (1000 - (m_offset - tick)); //好了,我们已经自己算出了毫秒,可以愉快的把毫秒加到DateTime里了。 DateTime now = DateTime.Now; return new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Month, now.Second, ms); } } }
大致思路就是,用Evironment.TickCount可以取得系统启动所运行的总毫秒数。我们要做的,就是想办法利用这个总毫秒数,为DateTime添加毫秒属性。当第一次调用DateTimePrecisely.Now时,我们等待一次跨秒并记录跨秒这一刻的总毫秒数与1000的余数,以此来作为毫秒的参考零点。之后每次调用DateTimePrecisely.Now,都会将当前的总毫秒数跟1000的余数与这个毫秒的参考零点作比较,并算出该秒的毫秒数。