参考文档 https://docs.microsoft.com/zh-cn/windows/win32/api/sysinfoapi/
Win32
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
[MarshalAs(UnmanagedType.U2)]
internal ushort year; // 年
[MarshalAs(UnmanagedType.U2)]
internal ushort month; // 月
[MarshalAs(UnmanagedType.U2)]
internal ushort dayOfWeek; // 星期
[MarshalAs(UnmanagedType.U2)]
internal ushort day; // 日
[MarshalAs(UnmanagedType.U2)]
internal ushort hour; // 时
[MarshalAs(UnmanagedType.U2)]
internal ushort minute; // 分
[MarshalAs(UnmanagedType.U2)]
internal ushort second; // 秒
[MarshalAs(UnmanagedType.U2)]
internal ushort milliseconds; // 毫秒
}
[DllImport(Kernel32)]
internal static extern void GetLocalTime(ref SystemTime lpSystemTime);
[DllImport(Kernel32)]
internal static extern bool SetLocalTime(ref SystemTime lpSystemTime);
[DllImport(Kernel32)]
internal static extern void GetSystemTime(ref SystemTime lpSystemTime);
[DllImport(Kernel32)]
internal static extern bool SetSystemTime(ref SystemTime lpSystemTime);
C#
/// <summary>
/// 获取本地时间
/// </summary>
/// <returns></returns>
public static DateTime GetLocalTime()
{
SystemTime sysTime = new SystemTime();
GetLocalTime(ref sysTime);
return SystemTime2DateTime(sysTime);
}
/// <summary>
/// 设置本地时间
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static bool SetLocalTime(SystemTime dateTime)
{
bool success = SetLocalTime(ref dateTime);
return success;
}
/// <summary>
/// 获取系统时间
/// </summary>
/// <returns></returns>
public static DateTime GetSystemTime()
{
SystemTime sysTime = new SystemTime();
GetSystemTime(ref sysTime);
return SystemTime2DateTime(sysTime);
}
/// <summary>
/// 设置系统时间(UTC)
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static bool SetSystemTime(DateTime dateTime)
{
SystemTime sysTime = DateTime2SystemTime(dateTime);
bool success = SetSystemTime(ref sysTime);
return success;
}
/// <summary>
/// 将SystemTime转换为DateTime
/// </summary>
/// <param name="sysTime"></param>
/// <returns></returns>
public static DateTime SystemTime2DateTime(SystemTime sysTime)
{
return new DateTime(sysTime.year, sysTime.month, sysTime.day, sysTime.hour, sysTime.minute, sysTime.second, sysTime.milliseconds);
}
/// <summary>
/// 将DateTime转换为SystemTime
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static SystemTime DateTime2SystemTime(DateTime dateTime)
{
SystemTime sysTime = new SystemTime
{
year = Convert.ToUInt16(dateTime.Year),
month = Convert.ToUInt16(dateTime.Month),
day = Convert.ToUInt16(dateTime.Day),
hour = Convert.ToUInt16(dateTime.Hour),
minute = Convert.ToUInt16(dateTime.Minute),
second = Convert.ToUInt16(dateTime.Second),
milliseconds = Convert.ToUInt16(dateTime.Millisecond)
};
return sysTime;
}