单击按钮时在 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/
我正在尝试使用 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/