如何在 Windows 10 IoT 中设置系统时间?

Posted

技术标签:

【中文标题】如何在 Windows 10 IoT 中设置系统时间?【英文标题】:How to set system time in 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 获取数据......最后半打左右的启动它始终在一个月前的同一时间启动,并且住在那里。 【参考方案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(实时时钟)模块。 (也需要额外的编码)

【讨论】:

我将此答案与 ***.com/a/33328911/1690217 一起使用,以在与 IoT 中心的连接因 SAS 令牌到期而失败时强制进行时间同步【参考方案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"

【讨论】:

不,你不能在 UWP 应用中调用 PowerShell 命令。根据:social.msdn.microsoft.com/Forums/sqlserver/en-US/… 它通过 ProcessLauncher (ms-iot.github.io/content/en-US/win10/samples/…) 工作。只需调用一个 script.cmd 然后使用 PowerShell。有点复杂,但有效。我会看看你的链接,谢谢。【参考方案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

【讨论】:

以上是关于如何在 Windows 10 IoT 中设置系统时间?的主要内容,如果未能解决你的问题,请参考以下文章

在windows中设置环境变量PATH

在 C# 中设置系统卷 Windows 10 [重复]

如何在Windows系统中设置Python程序定时运行

如何在Windows系统中设置Python程序定时运行

在 Windows 中设置默认堆大小 [重复]

如何在Windows 8/8.1系统中设置VPN