黎波

Windows Mobile Development for Line of Business
posts - 179, comments - 1140, trackbacks - 36, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

在我们编写的 Windows CE 或 Windows Mobile 应用程序中,常常通过调用 System.DateTime.Now 来获得设备的当前时间。我们可以利用设备的当前时间给变量和控件赋值,或者生成单据号和主键字段值等。不过,细心的你可能已经发现,在 Windows Mobile 应用程序中每次调用 System.DateTime.Now 获取到的 DateTime,它的 Millisecond 值始终为 0。这难道是 .NET Compact Framework 的 bug?事实上就算你用 Native 代码调用 GetLocalTime 或 GetSystemTime API 函数,得到的时间的毫秒也是 0。
那么,有没有办法在 Windows Mobile 程序中获得包含 Millisecond 的 DateTime 呢?办法是有的,不过没有直接的,需要自己编写一点代码来实现。OpenNETCF 顾问 Chris Tacke 就介绍了一种方法,利用 System.Environment.TickCount 获取系统启动后经过的毫秒数,再整除以 1000 得到一个一秒以内的时间差,之后可以利用这个时间差来计算出当前 DateTime 时间的 Millisecond 值。
详细的原理阐述和具体的代码实现就不再这里粘贴了,需要的朋友可以阅读《Getting a Millisecond-Resolution DateTime under Windows CE》一文,文章还附带了打包的示例代码PDF格式提供下载。
在分布式环境下,一般会选择 GUID 或精确到毫秒的时间(DateTime)作为在设备上新增数据的唯一标识,以避免数据提交到中央服务器后出现主键冲突。关于这个话题可以阅读我N久前写的《在PPC上用时间做唯一编号遇到的问题及其解决方法》。

Feedback

#1楼    回复  引用  查看    

2007-11-23 21:43 by 一支鱼刺      
WM5/Smartphone上,System.DateTime.Now 获取到的 DateTime,它的 Millisecond 的值没问题。

会不会PDA的问题?

#2楼 [楼主]   回复  引用  查看    

2007-11-24 18:38 by 黎波      
@一支鱼刺
我刚在WM5 Smartphone仿真器测试,System.DateTime.Now.Millisecond 为0。

#3楼    回复  引用  查看    

2008-02-05 03:01 by fox23      
恩,这是一个常见的问题,不是OS本身的原因,而是由OEM决定的,OEM实现CE设备时间函数的方式决定了你能通过传统的时间函数获得时间的精度,而通常,基于某些性能方面的考虑,大多数的OEMs只是简单的返回了RTC(real time clock)的值,其精度为一秒。

#4楼    回复  引用    

2008-03-05 16:00 by Eric123 [未注册用户]
直接GetLocaolTime,里面什么都有,还用.net做……

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 

另存  打印