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

时间:2017-01-26 16:17:48

标签: c# asp.net windows-mobile windows-ce

我正在尝试使用coredll.dll设置Windows Mobile设备时间。我已经创建了将设置时间的函数,但我对如何在按钮单击上调用函数来设置时间感到困惑。下面是设置时间但不确定如何在按钮单击中调用它的对象和方法

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

[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?
      }

2 个答案:

答案 0 :(得分:1)

首先需要实现一个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); 
   }

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

注意:由于TZ或DST更改,本地时间可能会发生变化,但所有计算机(香港或纽约)的系统时间都相同。否则,IT世界就会失去同步。

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

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

虽然有人可能会考虑在更改小时值时调整dayofweek。但是如果你改变任何其他值,就没有必要。

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

答案 1 :(得分:0)

您可以从VS工具箱中拖动dateTimePicker1元素,然后将其放入表单中。它将命名为:btnSync。 如果您的表单中有一个按钮名称private void btnSync_Click(object sender, EventArgs e) { DateTime dtToBeSet = dateTimePicker1.Value; SetSystemDateTime(dtToBeSet); } ,要设置您点击该按钮时的设备日期和时间,您可以这样做:

DateTimePicker

如果您没有使用DateTime,则无论如何都要从UI元素中检索您的值,创建class ListUsers(APIView): """ View to list all users in the system. * Requires token authentication. * Only admin users are able to access this view. """ authentication_classes = (authentication.TokenAuthentication,) permission_classes = (permissions.IsAdminUser,) def get(self, request, format=None): """ Return a list of all users. """ usernames = [user.username for user in User.objects.all()] return Response(usernames) 然后进行设置。