today example c# time

example - time class c#



Configure la hora programáticamente usando C# (5)

Esta es la llamada de la API de Win32 para establecer la hora del sistema:

[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; } [DllImport("kernel32.dll", SetLastError=true)] public static extern bool SetSystemTime(ref SYSTEMTIME theDateTime );

Sin embargo, no estoy exactamente seguro de cómo conseguiría la seguridad para que pueda ejecutar esa función en el cliente.

Puede obtener muchos más detalles sobre la configuración de la hora del sistema en PInvoke .

¿Cuál es la mejor manera de configurar el tiempo en una máquina remota de forma remota? La máquina ejecuta Windows XP y recibe la nueva hora a través de una llamada de servicio web. El objetivo es mantener las máquinas remotas sincronizadas con el servidor. El sistema está bloqueado para que nuestro servicio web sea el único acceso, por lo que no puedo usar un servidor horario en cada máquina remota.


La forma de consultar una máquina de red por su tiempo de sistema es NetRemoteTOD .

Aquí hay un código para hacerlo en Delphi (un ejemplo de uso se publica a continuación).

Como depende de las llamadas a la API de Windows, no debería ser demasiado diferente en C #.

unit TimeHandler; interface type TTimeHandler = class private FServerName : widestring; public constructor Create(servername : widestring); function RemoteSystemTime : TDateTime; procedure SetLocalSystemTime(settotime : TDateTime); end; implementation uses Windows, SysUtils, Messages; function NetRemoteTOD(ServerName :PWideChar; var buffer :pointer) : integer; stdcall; external ''netapi32.dll''; function NetApiBufferFree(buffer : Pointer) : integer; stdcall; external ''netapi32.dll''; type //See MSDN documentation on the TIME_OF_DAY_INFO structure. PTime_Of_Day_Info = ^TTime_Of_Day_Info; TTime_Of_Day_Info = record ElapsedDate : integer; Milliseconds : integer; Hours : integer; Minutes : integer; Seconds : integer; HundredthsOfSeconds : integer; TimeZone : LongInt; TimeInterval : integer; Day : integer; Month : integer; Year : integer; DayOfWeek : integer; end; constructor TTimeHandler.Create(servername: widestring); begin inherited Create; FServerName := servername; end; function TTimeHandler.RemoteSystemTime: TDateTime; var Buffer : pointer; Rek : PTime_Of_Day_Info; DateOnly, TimeOnly : TDateTime; timezone : integer; begin //if the call is successful... if 0 = NetRemoteTOD(PWideChar(FServerName),Buffer) then begin //store the time of day info in our special buffer structure Rek := PTime_Of_Day_Info(Buffer); //windows time is in GMT, so we adjust for our current time zone if Rek.TimeZone <> -1 then timezone := Rek.TimeZone div 60 else timezone := 0; //decode the date from integers into TDateTimes //assume zero milliseconds try DateOnly := EncodeDate(Rek.Year,Rek.Month,Rek.Day); TimeOnly := EncodeTime(Rek.Hours,Rek.Minutes,Rek.Seconds,0); except on e : exception do raise Exception.Create( ''Date retrieved from server, but it was invalid!'' + #13#10 + e.Message ); end; //translate the time into a TDateTime //apply any time zone adjustment and return the result Result := DateOnly + TimeOnly - (timezone / 24); end //if call was successful else begin raise Exception.Create(''Time retrieval failed from "''+FServerName+''"''); end; //free the data structure we created NetApiBufferFree(Buffer); end; procedure TTimeHandler.SetLocalSystemTime(settotime: TDateTime); var SystemTime : TSystemTime; begin DateTimeToSystemTime(settotime,SystemTime); SetLocalTime(SystemTime); //tell windows that the time changed PostMessage(HWND_BROADCAST,WM_TIMECHANGE,0,0); end;

Y aquí está el ejemplo de uso:

procedure TfrmMain.SynchLocalTimeWithServer; var tod : TTimeHandler; begin tod := TTimeHandler.Create(cboServerName.Text); try tod.SetLocalSystemTime(tod.RemoteSystemTime); finally FreeAndNil(tod); end; //try-finally end;


También podría hacer esto en un archivo por lotes usando alguna combinación de

TIME

para establecer el tiempo, y

net time //server_name

para recuperar el tiempo de un servidor.


Utilizaría las capacidades de tiempo de Internet integradas de Windows. Puede configurar un servidor horario en su servidor, obtener tiempo de un servidor horario de segundo nivel y hacer que todas las máquinas cliente obtengan tiempo de él.

He estado antes en el camino de configuración de sistema de aplicación.


Esta es la rutina que he estado usando durante años para leer el valor DateTime de nuestro servidor SQL (usando la hora del archivo), convertirlo a SYSTEMTIME que está configurado en la PC.

Esto funciona para PC y dispositivos con Windows Mobile.

Se puede llamar en cualquier momento que llame a su servidor SQL.

public class TimeTool { private static readonly DateTime NODATE = new DateTime(1900, 1, 1); #if PocketPC [DllImport("coredll.dll")] #else [DllImport("kernel32.dll")] #endif static extern bool SetLocalTime([In] ref SYSTEMTIME lpLocalTime); public struct SYSTEMTIME { public short Year, Month, DayOfWeek, Day, Hour, Minute, Second, Millisecond; /// <summary> /// Convert form System.DateTime /// </summary> /// <param name="time">Creates System Time from this variable</param> public void FromDateTime(DateTime time) { Year = (short)time.Year; Month = (short)time.Month; DayOfWeek = (short)time.DayOfWeek; Day = (short)time.Day; Hour = (short)time.Hour; Minute = (short)time.Minute; Second = (short)time.Second; Millisecond = (short)time.Millisecond; } public DateTime ToDateTime() { return new DateTime(Year, Month, Day, Hour, Minute, Second, Millisecond); } public static DateTime ToDateTime(SYSTEMTIME time) { return time.ToDateTime(); } } // read SQL Time and set time on device public static int SyncWithSqlTime(System.Data.SqlClient.SqlConnection con) { SYSTEMTIME systemTime = new SYSTEMTIME(); DateTime sqlTime = NODATE; string sql = "SELECT GETDATE() AS [CurrentDateTime]"; using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, con)) { try { cmd.Connection.Open(); System.Data.SqlClient.SqlDataReader r = cmd.ExecuteReader(); while (r.Read()) { if (!r.IsDBNull(0)) { sqlTime = (DateTime)r[0]; } } } catch (Exception) { return -1; } } if (sqlTime != NODATE) { systemTime.FromDateTime(sqlTime); // Convert to SYSTEMTIME if (SetLocalTime(ref systemTime)) { //Call Win32 API to set time return 1; } } return 0; } }