Как мне установить системные часы Windows на правильное местное время, используя C #? - PullRequest
8 голосов
/ 21 мая 2011

Как мне установить системные часы Windows на правильное местное время, используя C #?

Ответы [ 4 ]

11 голосов
/ 21 мая 2011

Вам потребуется P / Invoke для функции SetLocalTime из Windows API. Объявите это так в C #:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool SetLocalTime(ref SYSTEMTIME lpSystemTime);

[StructLayout(LayoutKind.Sequential)]
internal struct SYSTEMTIME
{
    public ushort wYear;
    public ushort wMonth;
    public ushort wDayOfWeek;    // ignored for the SetLocalTime function
    public ushort wDay;
    public ushort wHour;
    public ushort wMinute;
    public ushort wSecond;
    public ushort wMilliseconds;
}

Чтобы установить время, вы просто инициализируете экземпляр структуры SYSTEMTIME с соответствующими значениями и вызываете функцию. Пример кода:

SYSTEMTIME time = new SYSTEMTIME();
time.wDay = 1;
time.wMonth = 5;
time.wYear = 2011;
time.wHour = 12;
time.wMinute = 15;

if (!SetLocalTime(ref time))
{
    // The native function call failed, so throw an exception
    throw new Win32Exception(Marshal.GetLastWin32Error());
}

Однако обратите внимание, что вызывающий процесс должен иметь соответствующие привилегии для вызова этой функции. В Windows Vista и более поздних версиях это означает, что вам придется запрашивать повышение прав процесса.


В качестве альтернативы, вы можете использовать функцию SetSystemTime , которая позволяет вам установить время в UTC (Всемирное координированное время). Используется та же самая структура SYSTEMTIME, и две функции вызываются одинаковым образом.

6 голосов
/ 21 мая 2011

.NET не предоставляет функции для этого, но вы можете использовать Win32 API SetSystemTime (в kernel32.dll) метод.Чтобы получить время UTC, вы должны использовать NTP Protocol Client , а затем настроить это время на местное время в соответствии с вашими региональными настройками.

public struct SYSTEMTIME
{    
  public ushort wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds;
}

[DllImport("kernel32.dll")]
public extern static uint SetSystemTime(ref SYSTEMTIME lpSystemTime);

SYSTEMTIME systime = new SYSTEMTIME();
systime = ... // Set the UTC time here
SetSystemTime(ref systime);
2 голосов
/ 21 мая 2011

Вот пара статей о том, как это сделать, в комплекте с запросом атомных часов на правильное время.

http://www.codeproject.com/KB/IP/ntpclient.aspx

http://www.codeproject.com/KB/datetime/SNTPClient.aspx

1 голос
/ 09 марта 2016

Чтобы обойти проблему с привилегиями SE_SYSTEMTIME_NAME, попробуйте создать запланированное задание для запуска приложения и включить «Запуск с самыми высокими привилегиями».

...