我正在尝试将设备的系统日期和时间同步到它所停靠的桌面,我正在使用紧凑的框架(C#)。
我的目标是检测设备上次同步到桌面计算机上的数据库的时间。
我该怎么做?
答案 0 :(得分:2)
我不确定最后的问题是什么。如果您询问,如何将设备的时间与设备停靠时的PC时间同步,那么您可以使用免费的ITSUtils和PC上的一些注册表更改来自动执行时间监听: 注册表更改
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\AutoStartOnConnect]
"OnConnect"="\"c:\\windows\\system32\\cmd.exe\" /c d:\\OnConnect\\install.bat"
如果您有权限,也可以在experts-exchange查看我的帖子。
您可以使用任何bat或cmd文件代替install.bat。itsutils包含一个名为psynctime的PC应用程序。您只需要在您创建并在注册表中链接的bat / cmd文件中启动psynctime。然后将设备时间同步到PC的时间。确保bat文件可以访问itsutil文件,或者在PATH环境的dir中或者bat / cmd的直接文件中使用itutils。
作为替代方案,您必须编写DLL和activesync远程调用代码来同步时间。因此,使用psynctime工具更容易。
您知道该设备可以使用您的PC的互联网连接使用互联网吗?请参阅ActiveSync连接设置并查找“PC已连接到工作/ Internet /自动”。如果设置为自动或互联网,您的设备应该能够通过ActiveSync连接访问互联网。只需在设备上尝试使用Internet Explorer Mobile进行测试即可。如果它适用于您,您还可以将SNTP服务与Mitch提供的代码一起使用。但是,您还必须添加检测设备何时通过ActiveSync连接的代码。
答案 1 :(得分:2)
这是我一直在使用的那个。我在第一次启动数据库对象时使设备同步。
#if PocketPC
[DllImport("coredll.dll")]
#else
[DllImport("kernel32.dll")]
#endif
private static extern bool SetLocalTime([In] ref SYSTEMTIME lpLocalTime);
...是的,我的Windows PC使用与WinMobile PC相同的代码。
这个NODATE
变量对我的整个项目都是全局的,并且定义为1900年1月1日。希望这个公司在SQL Server中没有发生任何事情!
从结构开始:
/// <summary>
/// SYSTEMTIME structure with some useful methods
/// </summary>
public struct SYSTEMTIME {
public short Year, Month, DayOfWeek, Day, Hour, Minute, Second, Millisecond;
/// <summary>
/// Convert form System.DateTime
/// </summary>
/// <param name="time">Creates System Time from this variable</param>
public void FromDateTime(DateTime time) {
Year = (short)time.Year;
Month = (short)time.Month;
DayOfWeek = (short)time.DayOfWeek;
Day = (short)time.Day;
Hour = (short)time.Hour;
Minute = (short)time.Minute;
Second = (short)time.Second;
Millisecond = (short)time.Millisecond;
}
/// <summary>
/// Convert to System.DateTime
/// </summary>
public DateTime ToDateTime() {
return new DateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
}
/// <summary>
/// STATIC: Convert to System.DateTime
/// </summary>
public static DateTime ToDateTime(SYSTEMTIME time) {
return time.ToDateTime();
}
}
然后就像我在这个调用方法中那样使用该结构(我与SQL Server同步)。
/// <summary>
/// Synchronize the Time on the SQL Server with the time on the device
/// </summary>
public static int SyncWithSqlTime() { // pass in SQL Time and set time on device
SYSTEMTIME st = new SYSTEMTIME();
DateTime sqlTime = Global.NODATE;
using (SqlCommand cmd = new SqlCommand("SELECT GETDATE() AS CurrentDateTime;", new SqlConnection(DataSettings.DatabaseConnectionString))) {
try {
cmd.Connection.Open();
SqlDataReader r = cmd.ExecuteReader();
while (r.Read()) {
if (!r.IsDBNull(0)) {
sqlTime = (DateTime)r[0];
}
}
} catch (Exception) {
return -1;
}
}
if (sqlTime != Global.NODATE) {
st.FromDateTime(sqlTime); // Convert to SYSTEMTIME
if (SetLocalTime(ref st)) { //Call Win32 API to set time
return 1;
}
}
return 0;
}
底部的最后if
条件是我使用SetLocalTime
设置时间的位置。
希望这能让你到达某个地方,
〜乔
答案 2 :(得分:1)
为什么不使用SNTP(网络时间协议)同步国际标准时间:
然后您可以检查数据库上次更新时间。 [我在移动设备上使用了链接代码]
使用该代码(每小时调用一次,或者您需要的任何刷新间隔):
SNTPClient client = new SNTPClient(sntpTimeServerString);
client.Connect(5000, true);
// Set system clock to timenow
DateTime timenow = client.ToTime();
更新(根据OP的评论):由于您没有互联网连接,我认为您需要使用时间以外的其他内容来确定上次同步。例如,使用最后一个序列Id来确定设备的本地数据库与桌面相比是否有变化。
答案 3 :(得分:0)
远程API 2(RAPI2)。 =&GT; 你抓住两个rapi.CreateProcess,一个用于日期,一个用于时间。
rapi.CreateProcess("cmd", "/c date " + DateTime.Now.ToString("dd-MM-yyyy"));
rapi.CreateProcess("cmd", "/c time " + DateTime.Now.ToString("HH:mm:ss"));
它会打开两个Windows命令提示符,将手机与手机上的时钟同步。