En mi caso no uso la fecha del sistema ni de la AEAT, porque la AEAT va a estar muchas veces caida y el registro deberiamos grabarlo si o si en nuestros SIF y darle la factura verificable al cliente final. Si no quieres seguir facturando sin tener conexion a la AEAT pues un control en nuestro registro a modo de campo y aviso en pantalla y no seguimos facturando hasta que se restablezca la conexion con la AEAT (Bucle Timer), Una vez restablecida la comunicacion se envia el ultimo registro como se tenga que enviar y a seguir facturando. Pero la hora tiene que ser exacta, de lo contrario nos va a dar mucho dolor de cabeza tener registros rechazados por fechas, horas y huellas que no coinciden apilados en los clientes. Si tenemos un cliente que no se ha dado cuenta de que tiene la fecha y hora mal ¿que hacemos? Le podemos poner un control y decirle que cambie la pila de la CPU o pasamos de eso y mientras que su SO funcione y tenga internet, calculamos la fecha y hora fuera del Sistema, calculamos si estamos en invierno o verano para aplicar a la UTC el horario que tenemos en España(península) UTC + 1 o nó, pero todo fuera del sistema y de la AEAT que tambien cojera la hora por servidores sincronizados por satélite como Nopuedoponerenlaces.roa.es/cgi-bin/horautc
Este codigo está en VB.net para el que le venga bien. Esta comentado
Código:
Try
'Puede que tengas que ponerlo para asegurarte que el servidor no te rechaza por falta de seguridad
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Dim url As String = "Nopuedoponerenlaces.roa.es/cgi-bin/horautc"
Dim request As WebRequest = WebRequest.Create(url)
request.Timeout = 5000 ' Tiempo de espera de 5 segundos creo que sobrado
Dim response As WebResponse = request.GetResponse() ' obtengo la respuesta del servidor
Dim responseText As String
Using stream As Stream = response.GetResponseStream()
Using reader As New StreamReader(stream)
responseText = reader.ReadToEnd().Trim() ' Limpiar espacios o caracteres extra
End Using
End Using
' Tenemos una respuesta en una cadena de numeros(String) y hay que convertirla a un número de milisegundos
Dim timestamp As Long
If Long.TryParse(responseText, timestamp) Then 'Esta comprobacion la podemos omitir porque responseText siempre sera una cadena de numeros convertible a long pero bueno...
Dim utcTime As DateTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime
'Determinar si estamos en horario de verano o invierno en España
Dim year As Integer = utcTime.Year
Dim ultimoMarzo As DateTime = New DateTime(year, 3, DateTime.DaysInMonth(year, 3))
' Buscamos el último domingo de marzo que es cuando entra el horario de verano)
While ultimoMarzo.DayOfWeek <> DayOfWeek.Sunday
ultimoMarzo = ultimoMarzo.AddDays(-1)
End While
ultimoMarzo = New DateTime(year, 3, ultimoMarzo.Day, 2, 0, 0, DateTimeKind.Utc)
' Buscamos el último domingo de octubre que es cuando termina el horario de verano
Dim ultimoOctubre As DateTime = New DateTime(year, 10, DateTime.DaysInMonth(year, 10))
While ultimoOctubre.DayOfWeek <> DayOfWeek.Sunday
ultimoOctubre = ultimoOctubre.AddDays(-1)
End While
ultimoOctubre = New DateTime(year, 10, ultimoOctubre.Day, 1, 0, 0, DateTimeKind.Utc)
' Si estamos entre marzo y octubre estamos en horario de verano si no estamos en horario de invierno
Dim esHorarioVerano As Boolean = utcTime >= ultimoMarzo AndAlso utcTime < ultimoOctubre
' Aplicamos 2 o 1 segun sea
Dim offsetEspaña As Integer = If(esHorarioVerano, 2, 1)
' Calculamos la hora en España sin tener en cuenta el sistema
Dim horaLocalEspaña As DateTime = utcTime.AddHours(offsetEspaña)
' lo muestro para que se vea, pero cada cual aplica a su forma
MsgBox("Hora ajustada en España (Península): " & horaLocalEspaña.ToString("yyyy-MM-dd HH:mm:ss") & " (UTC+" & offsetEspaña & ")")
Else
MsgBox("Error: No se pudo interpretar el timestamp del servidor.")
End If
Catch ex As Exception
MsgBox("Error al obtener la hora UTC: " & ex.Message)
End Try