当前位置:  开发笔记 > 编程语言 > 正文

以编程方式更改系统日期

如何解决《以编程方式更改系统日期》经验,为你挑选了5个好方法。

如何使用C#以编程方式更改本地系统的日期和时间?



1> Andrew Hare..:

这是我找到答案的地方.

我在这里重新发布它以提高清晰度.

定义这个结构:

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
    public short wYear;
    public short wMonth;
    public short wDayOfWeek;
    public short wDay;
    public short wHour;
    public short wMinute;
    public short wSecond;
    public short wMilliseconds;
}

将以下extern方法添加到您的类:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetSystemTime(ref SYSTEMTIME st);

然后使用结构的实例调用该方法,如下所示:

SYSTEMTIME st = new SYSTEMTIME();
st.wYear = 2009; // must be short
st.wMonth = 1;
st.wDay = 1;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;

SetSystemTime(ref st); // invoke this method.


Microsoft.VisualStudio.Shell.Interop命名空间包含SYSTEMTIME结构的定义; 请参阅http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.systemtime.aspx
编写自定义C++/CLI包装器并插入另一个程序集比编写~9行结构更容易?
可以说这种方法设置了UTC时间.因此,如果您按当地时间Datetime.Now,那么它将设置错误的时间.我遇到了这个,很长一段时间都无法理解什么是错的......

2> MarmouCorp..:

您可以使用对DOS命令的调用,但是在Windows dll中调用该函数是一种更好的方法.

public struct SystemTime
{
    public ushort Year;
    public ushort Month;
    public ushort DayOfWeek;
    public ushort Day;
    public ushort Hour;
    public ushort Minute;
    public ushort Second;
    public ushort Millisecond;
};

[DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)]
public extern static void Win32GetSystemTime(ref SystemTime sysTime);

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

private void button1_Click(object sender, EventArgs e)
{
    // Set system date and time
    SystemTime updatedTime = new SystemTime();
    updatedTime.Year = (ushort)2009;
    updatedTime.Month = (ushort)3;
    updatedTime.Day = (ushort)16;
    updatedTime.Hour = (ushort)10;
    updatedTime.Minute = (ushort)0;
    updatedTime.Second = (ushort)0;
    // Call the unmanaged function that sets the new date and time instantly
    Win32SetSystemTime(ref updatedTime);
}  



3> Derek W..:

很多很棒的观点和方法已经在这里,但是这里有一些目前被遗漏的规范,我觉得可能会绊倒并迷惑一些人.

    Windows Vista,7,8 OS上,这将需要 UAC提示,以获得成功执行该SetSystemTime功能所需的管理权限.原因是调用进程需要SE_SYSTEMTIME_NAME权限.

    SetSystemTime函数期望SYSTEMTIME协调世界时(UTC)中的结构.否则它将无法正常工作.

根据您获取DateTime值的位置/方式,最好ToUniversalTime()SYSTEMTIME结构中设置相应的值之前安全地使用它.

代码示例:

DateTime tempDateTime = GetDateTimeFromSomeService();
DateTime dateTime = tempDateTime.ToUniversalTime();

SYSTEMTIME st = new SYSTEMTIME();
// All of these must be short
st.wYear = (short)dateTime.Year;
st.wMonth = (short)dateTime.Month;
st.wDay = (short)dateTime.Day;
st.wHour = (short)dateTime.Hour;
st.wMinute = (short)dateTime.Minute;
st.wSecond = (short)dateTime.Second;

// invoke the SetSystemTime method now
SetSystemTime(ref st); 



4> Avram..:

    PInvoke调用Win32 API SetSystemTime,(示例)

    具有WMI类Win32_OperatingSystem的System.Management类,并在该类上调用SetDateTime.

两者都要求调用者已被授予SeSystemTimePrivilege并且已启用此权限.



5> Hiren Raiyan..:

使用此功能更改系统时间(在窗口8中测试)

 void setDate(string dateInYourSystemFormat)
    {
        var proc = new System.Diagnostics.ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = @"C:\Windows\System32";
        proc.CreateNoWindow = true;
        proc.FileName = @"C:\Windows\System32\cmd.exe";
        proc.Verb = "runas";
        proc.Arguments = "/C date " + dateInYourSystemFormat;
        try
        {
            System.Diagnostics.Process.Start(proc);
        }
        catch
        {
            MessageBox.Show("Error to change time of your system");
            Application.ExitThread();
        }
    }
void setTime(string timeInYourSystemFormat)
    {
        var proc = new System.Diagnostics.ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = @"C:\Windows\System32";
        proc.CreateNoWindow = true;
        proc.FileName = @"C:\Windows\System32\cmd.exe";
        proc.Verb = "runas";
        proc.Arguments = "/C time " + timeInYourSystemFormat;
        try
        {
            System.Diagnostics.Process.Start(proc);
        }
        catch
        {
            MessageBox.Show("Error to change time of your system");
            Application.ExitThread();
        }
    }

示例: 调用表单 setDate的加载方法("5-6-92"); setTime("2:4:5 AM");

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有