Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Obtendo a hora de um servidor NT

Para obter a hora de um servidor NT, nós podemos usar a função da API NetRemoteTOD.

Nota: NetRemoteTOD, existe apenas no ambiente do NT. Este código não funcionará no Windows 95 ou 98.

Este é o código:

 

Private Type TIME_OF_DAY_INFO
  tod_elapsedt As Long  'número de segundos  _
                        desde 00:00:00, Janeiro 1, 1970.
  tod_msecs As Long     'o número de milisegundos _
                        de um ponto de início arbitrário  _
                        (system reset).
  tod_hours As Long     'hora atual (0-23)
  tod_mins  As Long     'minuto atual (0-59)
  tod_secs  As Long     'segundo atual (0-59)
  tod_hunds  As Long    'centésimo de segundo atual (0-99).
  tod_timezone  As Long 'TZ do servidor em minutos de GMT
  tod_tinterval  As Long 'intervalo de tempo para cada tic do relógio. _
                        Cada número representa 0.0001 de segundo.
  tod_day  As Long      'o dia do mes (1-31).
  tod_month  As Long    'o mes do ano (1-12).
  tod_year  As Long     'o ano.
  tod_weekday As Long   'o dia da semana: 0 é domingo
End Type

Private Declare Function apiNetRemoteTOD Lib "netapi32" _
  Alias "NetRemoteTOD" _
  (ByVal UncServerName As String, _
  BufferPtr As Long) _
  As Long

Private Declare Sub sapiCopyMemory Lib "kernel32" _
  Alias "RtlMoveMemory" _
  (hpvDest As Any, _
  hpvSource As Any, _
  ByVal cbCopy As Long)

'Função que pega a hora
Public Function fGetServerTime(ByVal strServer As String) As String

On Error GoTo ErrHandler
Dim tSvrTime As TIME_OF_DAY_INFO, lngRet As Long
Dim lngPtr As Long
Dim strOut As String
Dim intHoursDiff As Integer
Dim intMinsDiff As Integer
'Nome do servidor tem que ser precedido por \\
  If Not Left$(strServer, 2) = "\\" Then _
    Err.Raise vbObjectError + 5000

  strServer = StrConv(strServer, vbUnicode)
  lngRet = apiNetRemoteTOD(strServer, lngPtr)
  If Not lngRet = 0 Then Err.Raise vbObjectError + 5001
  Call sapiCopyMemory(tSvrTime, ByVal lngPtr, Len(tSvrTime))
 

  With tSvrTime
    intHoursDiff = .tod_timezone \ 60
    intMinsDiff = .tod_timezone Mod 60
    strOut = .tod_month & "/" & .tod_day & "/" _
       & .tod_year & " "
    If .tod_hours > 12 Then
      strOut = strOut & Format(.tod_hours - 12 - intHoursDiff, "00") _
        & ":" & Format$(.tod_mins - intMinsDiff, "00") & ":" _
       & Format$(.tod_secs, "00") & " PM"
    Else
      strOut = strOut & Format(.tod_hours - intHoursDiff, "00") _
        & ":" & Format$(.tod_mins - intMinsDiff, "00") & ":" _
       & Format$(.tod_secs, "00") & " AM"
    End If
  End With
  fGetServerTime = strOut
ExitHere:
  Exit Function
ErrHandler:
  fGetServerTime = vbNullString
  Resume ExitHere
End Function