单击按钮时在 Windows CE 设备上设置时间

Set time on Windows CE Device on button click

我正在尝试使用 coredll.dll 设置 Windows 移动设备时间。我已经创建了设置时间的功能,但我对如何在单击按钮时调用该功能来设置时间感到困惑。下面是设置时间的对象和方法,但不知道如何在按钮点击时调用它

//这将是您需要设置系统时间的方法

[DllImport("coredll.dll", SetLastError=true)]
static extern bool SetLocalTime(ref SYSTEMTIME lpSystemTime);

//这是你使用SetLocalTime前需要填写的对象

public struct SYSTEMTIME
{
     public short year;
     public short month;
     public short dayOfWeek;
     public short day;
     public short hour;
     public short minute;
     public short second;
     public short milliseconds;
}

//这是最后执行的方法

public static void SetSystemDateTime(DateTime dt)
{
     SYSTEMTIME systime;
     systime.year = (short)dt.Year;
     systime.month = (short)dt.Month;
     systime.day = (short)dt.Day;

     systime.hour = (short)dt.Hour;
     systime.minute = (short)dt.Minute;
     systime.second = (short)dt.Second;
     systime.milliseconds = (short)dt.Millisecond;
     systime.dayOfWeek = (short)dt.DayOfWeek;

     SetLocalTime(systime);
}

在下面的按钮点击方法中应该如何调用这个函数?

 private void btnSync_Click(object sender, EventArgs e)
        {
//What Should I write here?
      }

您可以从 VS 工具箱中拖动一个 DateTimePicker 元素,然后将其放入您的表单中。它将被命名为:dateTimePicker1。 如果您的表单中有一个按钮名称 btnSync,要在单击该按钮时设置您的设备日期和时间,您可以这样做:

private void btnSync_Click(object sender, EventArgs e)
{
     DateTime dtToBeSet = dateTimePicker1.Value;
     SetSystemDateTime(dtToBeSet);
}

如果您不使用 DateTimePicker,无论如何您都必须从 UI 元素中检索类似的值,创建一个 DateTime 然后设置它。

您首先需要实例化一个 DateTime 变量并用您要设置的值填充它。

   DateTime localDateTime = DateTime.Now;

现在 localDateTime 保存(计算机)本地日期和时间值。然后,您可以根据需要更改 DateTime 结构的属性。例如更改小时:

   //localDateTime.Hour=13; // cannot be changed, so create a new DateTime
DateTime newDT = new DateTime(localDateTime.year, localDateTime.month, localDateTime.day,
    13, localDateTime.minute, localDateTime.second, localDateTime.millisecond);

这会将 DateTime Hour 的值更改为 13。 更改后的 localDateTime 现在可用于更改点击处理程序中的本地时间:

   private void btnSync_Click(object sender, EventArgs e)
   {
      DateTime localDateTime = DateTime.Now;
      //localDateTime.Hour=13; // cannot be changed, so create a new DateTime
      DateTime newDT = new DateTime(localDateTime.year, localDateTime.month, localDateTime.day,
         13, localDateTime.minute, localDateTime.second, localDateTime.millisecond);
      SetSystemDateTime(newDT
      // set datetime a second time to avoid issues when crossing DST intervals
      System.Threading.Thread.Sleep(500);
      SetSystemDateTime(newDT); 
   }

顺便说一句:我将 SetSystemDateTime 命名为 SetLocalDateTime 更好,因为它更改的是本地时间而不是系统时间。本地时间是根据系统时间加上计算机时区偏移设置(即 GMT+1)加上当前夏令时偏移(如果有)计算得出的。另一种方法也适用,设置本地时间会根据偏移量更改系统时间。

注意:当地时间可能会因 TZ 或 DST 更改而更改,但系统时间在所有计算机(香港或纽约)上都是相同的。否则 IT 世界将不同步。

还有一个使用相同模式调用的 SetSystemTime API 函数:

  [DllImport("coredll.dll", SetLastError=true)]
  static extern bool SetSystemTime(ref SYSTEMTIME lpSystemTime);

尽管在更改小时值时可能会考虑调整星期几。但是如果你改变任何其他值就没有必要了。

记得两次调用SetSystemTime 或SetLocalTime 以避免跨DST 区域时出现问题。另见 http://www.hjgode.de/wp/2010/10/08/windows-mobile-setsystemtime-and-dst-einsteins-relativity-theory/