Obtener y cambiar la hora/fecha del sistema.
Para poder obtener la fecha y hora de nuestro sistema, asi como para modificarla utilizaremos unas APIs, para obtener la fecha/hora lo podemos hacer sin utilizar una API, solamente llamando a la clase Datetime:
DateTime.Now.ToString() // Nos devolverá una cadena que contiene fecha y hora
Pero en este caso utilizaremos una API para obtenerla, ya que necesitamos un formato, primero importamos la libreria:
using System.Runtime.InteropServices;
Ahora declaramos las APIs, Get y Set SystemTime, las cuales nos devolverán o cambiaran la fecha/hora del sistema:
-----------------------------------------------------
[DllImport("kernel32.dll")]
private extern static void GetSystemTime(ref SYSTEMTIME Time);
[DllImport("kernel32.dll")]
private extern static uint SetSystemTime(ref SYSTEMTIME Time);
-----------------------------------------------------
Ahora declaramos un struct que nos servirá como base para crear el formato de fecha/hora:
-----------------------------------------------------
private 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 Milliseconds;
}
-----------------------------------------------------
Y ahora simplemente para conocer la hora/fecha ejecutamos lo siguiente:
-----------------------------------------------------
SYSTEMTIME systime = new SYSTEMTIME();
GetSystemTime(ref systime);
-----------------------------------------------------
donde la variable systime contiene todos los datos de la fecha y hora, para acceder a ellos simplemente describimos lo que necesitamos:
systime.Hour.ToString() //nos devuelve una cadena que nos dice la hora
systime.Day.ToString() //nos devuelve una cadena que nos dice el dia
... // y todo lo demás.
Ahora para poderla modificar invocamos el método SetSystemTime, y le mandamos como parámetro el formato de la nueva hora/fecha:
-----------------------------------------------------
SYSTEMTIME systime = new SYSTEMTIME();
GetSystemTime(ref systime);
systime.Hour = (ushort)(5); //Pongo como hora las 5
SetSystemTime(ref systime);
-----------------------------------------------------
Ojo, debes de tener completo el formato, en el ejemplo anterior solo le modifico la hora, entonces no tiene caso que llene manualmente cada campo del formato, para eso hago un Get, para que automáticamente se llene cada campo de mi formato y luego solamente modifico la hora, asi dejo todos los demás campos del formato intactos.
Nota: El método GetSystemTime nos devuelve la hora universal cordinado (UTC), para obtener tu hora local debes restar o sumar el numero dependiendo de tu zona horaria, por ejemplo: las 24 horas (UTC) son las 19 horas Nueva York, hubo una diferencia de menos 5 horas.
También, si ejecutas este código desde un IDE no te funcionara, ya que para ello necesitas permisos de administrador, para probarlo ve al ejecutable y dale click derecho - ejecutar como administrador (Aquellos que tengan WVista o Win7 como yo).