0

我正在尝试将设备的系统日期和时间同步到它所停靠的桌面,我正在使用紧凑型框架 (C#)。

我的目标是检测设备上次同步到桌面计算机上的数据库的时间。

我怎样才能做到这一点?

4

4 回答 4

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.

希望这能让你有所收获,
~乔

于 2013-02-11T14:44:08.310 回答
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"

也见这里这里这里

如果您有访问权限,您还可以查看我在专家交流中的帖子。

您可以使用任何 bat 或 cmd 文件代替 install.bat。itsutils包含一个名为psynctime的 PC 应用程序。您只需要在您在注册表中创建和链接的 bat/cmd 文件中启动 psynctime。然后设备时间将与您的 PC 时间同步。确保 bat 文件可以访问 itsutil 文件,或者将 itsutils 放在 PATH 环境的目录中或在 bat/cmd 的目录中。

作为替代方案,您必须编写一个 DLL 和一个 activesync 远程调用代码来同步时间。所以更容易使用 psynctime 工具。

您知道该设备可以通过您的 PC 的互联网连接使用互联网吗?请参阅 ActiveSync 连接设置并查找“PC 已连接到 Work/Internet/Automatic”。如果设置为自动或 Internet,您的设备应该能够通过 ActiveSync 连接访问 Internet。只需在设备上尝试 Internet Explorer Mobile 即可进行测试。如果它适合您,您还可以使用 Mitch 提供的代码使用 SNTP 服务。但是,您还必须添加检测设备何时通过 ActiveSync 连接的代码。

于 2013-02-11T06:04:31.813 回答
1

为什么不使用 SNTP(网络时间协议)将两者同步到国际标准时间:

C# SNTP 客户端

然后你可以检查数据库上次更新时间。[我在移动设备上使用了链接代码]

该代码的使用方式如下(每小时调用一次,或您需要的任何刷新间隔):

   SNTPClient client = new SNTPClient(sntpTimeServerString);
   client.Connect(5000, true);

   // Set system clock to timenow 
   DateTime timenow = client.ToTime();

更新(基于 OP 的评论):由于您没有互联网连接,我认为您需要使用除时间以外的其他时间来确定上次同步。例如,使用最后一个序列 ID 来确定设备的本地数据库与桌面相比是否有变化。

于 2013-02-11T03:18:08.953 回答
0

远程 API 2 (RAPI2)。=> 你启动了两个 rapi.CreateProcess,一个用于日期,一个用于时间。

rapi.CreateProcess("cmd", "/c date " + DateTime.Now.ToString("dd-MM-yyyy"));
rapi.CreateProcess("cmd", "/c time " + DateTime.Now.ToString("HH:mm:ss"));

它将打开两个窗口命令提示符以将手机与 PC 上的时钟同步。

于 2014-11-25T10:02:05.440 回答