Ver Mensaje Individual
  #31  
Antiguo 30-01-2025
Rja750 Rja750 is offline
Miembro
 
Registrado: ene 2025
Posts: 155
Reputación: 2
Rja750 Va por buen camino
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

Última edición por Neftali [Germán.Estévez] fecha: 31-01-2025 a las 08:48:09. Razón: Añadir TAG's al código
Responder Con Cita