【问题标题】:How to set system time in Windows 10 IoT?如何在 Windows 10 IoT 中设置系统时间?
【发布时间】:2015-06-02 01:28:30
【问题描述】:

有没有办法在 Windows 10 IoT Core Insider Preview 中从我在 Raspberry Pi 2 上运行的应用程序设置系统时间?

由于缺少 kernel32.dll,这不起作用

    [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
    extern static bool Win32SetSystemTime(ref SystemTime sysTime);

【问题讨论】:

  • 我没有看到任何“能力”可以让你从沙箱内部做到这一点——msdn.microsoft.com/en-us/library/windows/apps/hh464936.aspx
  • 在程序代码之外,您应该能够在 IOT 设备上打开 PowerShell 并运行Set-Date 命令。
  • 嗯,是的,powershell 可以工作,这就是我一直在做的事情,但是,如果没有系统 ui 有效地结合起来,这意味着作为一个独立的设备无法获得准确的时间。希望他们在发布时间之前解决这个问题。时钟似乎明显漂移,特别是如果设备关闭然后再次打开电源。 (例如,通宵断电导致了将近 10 分钟的错误)
  • Pi 没有 RTC,因此每次启动时都会从 NTP 服务器获取时间。如果您对此不满意,您可以获取 Pi 的 RTC 附加组件,例如:thepihut.com/products/mini-rtc-module-for-raspberry-pi
  • @dannykay1710 从经验测试来看,它似乎没有或通常不会自动从 NTP 获取数据......最后半打左右的启动它始终在一个月前的同一时间启动,并且住在那里。

标签: c# raspberry-pi windows-10-iot-core


【解决方案1】:

首先,connect to your Pi 2 using PowerShell

使用命令set-date 设置时间。例如,如果您想将日期设置为 2015 年 10 月 3 日星期六下午 2:00,您可以输入 set-date 10/3/2015 2:00PM

命令tzutil 设置时区。输入tzutil /? 使用

【讨论】:

  • 问题是如何从应用程序中设置它。如 cmets 中所述,我了解如何从 powershell 设置它。但是,每次打开设备时连接到 powershell 来设置时间是不切实际的。该设备只有在始终连接到计算机时才能使用,
  • 日期应该在引号之间:set-date "10/3/2015 2:00PM"
  • 我使用 -> set-date "8/25/2017 2:32PM" 设置日期时间,但过了一会儿它会重置/更改。因此,需要 tzutil 来正确设置时区,因为 Pi 会根据时间服务器自动尝试更新当前日期时间。
  • 这个“最佳答案”已经过时了。只需使用 API windows 现在提供的 DateTimeSettings.SetSystemDate
【解决方案2】:

1-新的通用项目
2-添加参考>扩展>适用于 UWP 的 Windows IOT 扩展
3- 在 MainPage.xaml
上放置一个按钮、一个 datepicker 和一个 timepicer 控件 和

private void buttonSetSystemDatetime_Click(object sender, RoutedEventArgs e)
        {
            DateTimeOffset dto = datePicker1.Date+ timePicker1.Time;
            Windows.System.DateTimeSettings.SetSystemDateTime(dto);
        }

4-在项目设置中>设置你的目标版本和最低版本10.0;构建 16299
5- 双击 appxmanifest > Capabilities > 勾选“System Management”

6- 在 IOT 中运行应用程序并按下按钮。而不是返回默认应用程序。瞧!系统日期时间已更改。

注意:而不是每次都设置它。我建议您购买便宜的 rtc(实时时钟)模块。 (也需要额外的编码)

【讨论】:

【解决方案3】:

您可以在 UWP/IoT-Core 系统上从 C# 调用任何 PowerShell 例程。因此,PowerShell 命令始终在您的应用程序中可用。

例如,请参阅ProcessLauncher sample on GitHub

替代方案,按如下方式安排启动 PS 脚本:

在板上以管理员身份运行 PowerShell(按下 Windows 按钮,开始输入 PowerShell,右键单击图标并选择“以管理员身份运行”)。

Set-ExecutionPolicy RemoteSigned

PuTTy 以管理员身份到 RPi 并且:

setx PATH "%PATH%;C:\Windows\System32"

schtasks /create /tn "StartupPowerShell" /tr c:\Startup.bat /sc onstart /ru SYSTEM

Startup.bat

powershell -command "C:\IotCoreStartup.ps1"

IotCoreStartup.ps

$logFile = 'C:\StartupLog.txt'

get-date > $logFile

tzutil /s "UTC" >> $logFile

# set alternate time servers
"Setting additional time servers" >> $logFile
w32tm /config /syncfromflags:manual /manualpeerlist:"0.windows.time.com 1.pool.ntp.org" >> $logFile

根据需要删除计划任务:

schtasks /Delete /TN "StartupPowerShell"

如果要测试,则运行计划任务:

schtasks /Run /tn "StartupPowerShell"

【讨论】:

【解决方案4】:

目前看来,似乎没有办法实际编辑系统时间,但我想出了一个解决方法,至少可以在您的应用中获得正确的时间。 我创建了一个 TimeManager 类,重要部分如下。

获取您想要的正确时间(例如 NTP、其他网络时间、用户输入等)并输入到 UpdateOffset 方法中。

在应用程序的其余部分使用 TimeManager.Now 而不是 DateTime.Now

    static TimeSpan _offset = new TimeSpan(0,0,0);
    public static TimeSpan CurrentOffset //Doesn't have to be public, it is for me because I'm presenting it on the UI for my information
    {
        get { return _offset; }
        private set { _offset = value; }
    }

    public static DateTime Now
    {
        get
        {
            return DateTime.Now - CurrentOffset;
        }
    }

    static void UpdateOffset(DateTime currentCorrectTime) //May need to be public if you're getting the correct time outside of this class
    {
        CurrentOffset = DateTime.UtcNow - currentCorrectTime;
        //Note that I'm getting network time which is in UTC, if you're getting local time use DateTime.Now instead of DateTime.UtcNow. 
    }

我还建议添加诸如跟踪上次更新时间之类的内容,并标记以指示时间是否已更新,只是不想弄乱代码示例。

【讨论】:

    【解决方案5】:

    我使用 RTC 在我的 Raspberry Pi 上设置时间。虽然 Windows-iot 在考虑了几个小时的选项后没有原生支持从实时时钟初始化 Raspberry Pi 的软件时钟,但我发现了一些适合我的东西。

    我制作了一个控制台程序,它既可以将系统时间保存到 RTC,也可以读取 RTC 中的时间并将其打印为字符串。我制作了一个 power shell 脚本,它将在系统启动时运行该程序,以从实时时钟获取时间并将字符串传递给 set-date 命令。

    详情在这里:http://www.codeproject.com/Articles/1113626/Adding-the-Missing-Real-Time-Clock-to-Windows-IoT

    【讨论】:

      【解决方案6】:

      使用 Renci SSH shell 以管理员身份重新登录设备,然后使用 powershell 命令设置日期和时间。

      public static int SshCommand(string command, out string dataOut, out string error)
          {
      
              dataOut = "";
              error = "";
      
              try
              {
      
                  using (var client = new SshClient("127.0.0.1", USER_NAME, PASSWORD))
                  {
                      client.Connect();
                      //command = "powershell -Command " + "\u0022" + "set-date -date '8/10/2017 8:30:00 AM'" + "\u0022";
                      //command = "netsh interface ip show config";
                      var cmd = client.RunCommand(command);
                      var output = cmd.Result;
                      client.Disconnect();
                  }
      
                  return 1;
              }
              catch (Exception ex)
              {
                  error = ex.Message;
                  return 0;
              }
      
          }
      
      
      public static int SSHSetDateTime(DateTime dateTime)
          {
      
              // Variables
              int returnValue = 0;
              string command;
              string error;
              string dataOut;
      
              // Build date
              command = String.Format("powershell -Command \u0022set-date -date '{0:M/d/yyyy H:mm:ss tt}'\u0022", dateTime);
      
              //Build date
              if (SystemEx.SshCommand(command, out dataOut, out error) == 1)
              {
                  // Ok
                  returnValue = 1;
              }
      
              // Return
              return returnValue;
      
          }
      

      【讨论】:

        【解决方案7】:

        我知道您在问如何以编程方式执行此操作,但是,以下内容应提供足够的信息来创建一个在启动时运行的 PS 脚本。

        通过 Powershell 远程访问 Raspberry Pi

        1.) 在您的开发 PC 上运行 Windows 10 IoT Core Watcher 实用程序 (C:\Program Files (x86)\Microsoft IoT\WindowsIoTCoreWatcher.exe),并通过右键单击检测到的设备复制您的 Raspberry Pi IP 地址并选择复制 IP 地址。

        ◦单击窗口“开始”按钮

        ◦键入“WindowsIoTCoreWatcher”将其拉到搜索结果中

        ◦您可能需要右键单击程序名称并选择“固定到开始”以将其固定到您的开始屏幕以便于访问

        ◦按 Enter 运行它

        ◦您的设备应在 5 秒左右出现在列表中。如果没有,请关闭 Windows 10 IoT Core Watcher,然后重新启动

        2.) 在本地 PC 上启动管理员 PowerShell 控制台。最简单的方法是在 Windows 开始菜单附近的搜索网络和 Windows 文本框中键入“powershell”。 Windows 将在您的计算机上找到 PowerShell。右键单击 Windows PowerShell 条目并选择以管理员身份运行。 PS 控制台将显示。

        3.) 您可能需要在桌面上启动 WinRM 服务以启用远程连接。从 PS 控制台输入以下命令:

         net start WinRM 
        

        4.) 在 PS 控制台中,键入以下命令,将 '' 替换为 prev 中复制的 IP 值:

         Set-Item WSMan:\localhost\Client\TrustedHosts -Value <machine-name or IP Address>
        

        5.键入 Y 并按 Enter 确认更改。

        6.现在您可以开始与您的 Windows IoT Core 设备的会话。在您的管理员 PS 控制台中,键入:

        Enter-PSSession -ComputerName <IP Address> -Credential localhost\Administrator
        

        7.在凭据对话框中输入以下默认密码:

        p@ssw0rd

        注意:连接过程不是立即的,最多可能需要 30 秒。

        如果您成功连接到设备,您应该会在提示前看到您设备的 IP 地址。

        重命名您的设备并设置日期和时间

        1.要更改计算机名称,请使用 setcomputername 实用程序。在 PowerShell 中,键入以下命令。

        设置计算机名

        2. Pi 上的日期和时间必须正确,以便稍后在实验室中用于发布到 Azure 的安全令牌有效。要检查 Pi 上的当前时区设置,请键入:

        tzutil /g

        3.如果报告的时区不正确,您可以使用以下方法查找有效时区列表(您可能需要在 powershell 窗口中增加缓冲区大小):

        tzutil /l

        4.设置时区,在上面的步骤中找到你想要的时区的id,然后使用:

        tzutil /s "你的时区名称"

        例如,对于“太平洋标准时间”

        tzutil /s "太平洋标准时间"

        5.要查看 Raspberry Pi 上的日期,请键入

        获取日期

        6.如果日期或时间不正确,请使用设置日期实用程序

        设置日期“mm/dd/yy hh:mm:ss AM/PM”

        例如,如果是 2016 年 1 月 3 日下午 12:15:

        设置日期“01/03/16 12:15 PM”

        7.重启设备以使更改生效。可以使用shutdown命令如下:

        关机 /r /t 0

        【讨论】:

        • 有趣的是,在 win IOT 中设置日期根本不起作用
        【解决方案8】:

        请参阅 Microsoft API 参考文档,在 Windows.System 命名空间中,您可以使用 SetSystemDateTime 方法设置系统日期和时间。

        但你必须知道它在

        中可用
        • Windows IoT 扩展 SDK(引入 v10.0.16225.0) 及更高版本

        你可以使用 DateTimeSettings 静态类

        public static class DateTimeSettings
        

        然后调用 SetSystemDateTime 静态方法并发送 DateTimeOffset 类型的对象,以便在 Windows Iot 上设置日期和时间。

        public static void SetSystemDateTime(DateTimeOffset utcDateTime)
        

        https://docs.microsoft.com/en-us/uwp/api/windows.system.datetimesettings

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-06
          • 2016-12-19
          • 2022-06-13
          • 1970-01-01
          相关资源
          最近更新 更多