Page 1 sur 1
Mon PC avance... (heure)
Publié : lun. 01/oct./2012 22:17
par Golfy
Comme c'est la première fois que je vois ça, je voulais partager des astuces.
Tout d'abord, le composant RTC de la carte mère n'est pas en cause, ni la batterie !
L'heure du BIOS est donc correcte et les secondes s'écoulent normalement...
... sous WinXP, il n'en est pas de même : l'horloge prend presque 1 seconde d'avance toute les 5 secondes écoulées...
Donc,
1) voir l'association win32time et w32tm (
http://technet.microsoft.com/en-us/libr ... s.10).aspx)
2) Utiliser l'application ClockMon (qui synchronise l'heure Windows avec l'heure du composant interne RTC :
http://www.softdevlabs.com/ClockMon/ClockMon.html).
3) utiliser de temps en temps une synchronisation NTP (mais pas la peine de le faire trop souvent si le RTC est fiable)
Voilà ! si vous avez aussi rencontré des problèmes de ce genre là dans vos programmations, dites-le moi (je vais faire des recherches de mon coté... utilisation intensive des eventtimers ?)
Re: Mon PC avance... (heure)
Publié : mar. 02/oct./2012 0:12
par Backup
pour mettre a l'heure l'ordi avec Purebasic :
Code : Tout sélectionner
;/ Get Time from NTP Server / Set Local Time / Get Time Zone information
; Droopy 15/01/06 + Fweil for TimeZone functions
; PureBasic 4.10
ProcedureDLL.s GetTimeZoneName() ; Return the name of the Time Zone
;/ Author : Fweil
GetTimeZoneInformation_(TimeZoneInfo.TIME_ZONE_INFORMATION)
While TimeZoneInfo\StandardName[i] <>0 And i <= 32
sStandardName.s + Chr(TimeZoneInfo\StandardName[i])
i + 1
Wend
ProcedureReturn sStandardName
EndProcedure
ProcedureDLL GetTimeZone() ; Hour to add to the UTC hour
;/ Author : Fweil
GetTimeZoneInformation_(TimeZoneInfo.TIME_ZONE_INFORMATION)
retour=-TimeZoneInfo\Bias/60
ProcedureReturn retour
EndProcedure
ProcedureDLL SetDate(date) ; Set the System Date : Return 1 if success
Heure.SYSTEMTIME
Heure.SYSTEMTIME\wYear=Year(date)
Heure.SYSTEMTIME\wMonth=Month(date)
Heure.SYSTEMTIME\wDay=Day(date)
Heure.SYSTEMTIME\wDayOfWeek=DayOfWeek(date)
Heure.SYSTEMTIME\wHour=Hour(date)
Heure.SYSTEMTIME\wMinute=Minute(date)
Heure.SYSTEMTIME\wSecond=Second(date)
If SetSystemTime_(Heure)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
ProcedureDLL GetNTPTime(NTPServer.s,TimeOut) ; Ask a NTP Server and return the Date as PureBasic format / 0 if it could not be joined
; Server = time.ien.it / time.nist.gov / ntp1.fau.de
InitNetwork()
CnxionId= OpenNetworkConnection(NTPServer,37)
If CnxionId
;/ Wait until the Server Send Datas
While NetworkClientEvent(CnxionId)=0
Delay(1)
t+1
If t>TimeOut
ProcedureReturn 0
EndIf
Wend
;/ Wait until the Server Send Datas
While NetworkClientEvent(CnxionId)=0
Delay(1)
Wend
;/ Get four Bytes
Buffer.s=Space(4)
ReceiveNetworkData(CnxionId,@Buffer,4)
CloseNetworkConnection(CnxionId)
;/ Calcule the Date as PureBasic Format ( UTC )
NTPTime=Asc(Left(Buffer,1))*16777216 + Asc(Mid(Buffer,2,1))*65536 + Asc(Mid(Buffer,3,1))*256 + Asc(Right(Buffer,1)) - 2840140800
NTPTime=AddDate(NTPTime,#PB_Date_Year,20) ; Add 20 years
ProcedureReturn NTPTime
Else
ProcedureReturn 0
EndIf
EndProcedure
ProcedureDLL GetNTPTime2(NTPServer.s) ; Default TimeOut = 120ms
ProcedureReturn GetNTPTime(NTPServer.s,120)
EndProcedure
;/ Test
NTPTime=GetNTPTime2("ntp.unice.fr") ;time.ien.it
If NTPTime
;/ Set the Computer Time as NTP Time
SetDate(NTPTime)
;/ Show information about Hour
temp.s="UTC Time : "+FormatDate(" %dd/%mm/%yy %hh:%ii:%ss",NTPTime)+#CR$
temp+"Zone : "+GetTimeZoneName()+#CR$
temp+"Shift : "+Str(GetTimeZone())+" hour(s)"+#CR$
temp+"Local Time as US format : "+FormatDate(" %mm/%dd/%yy %hh:%ii:%ss",NTPTime+GetTimeZone()*60*60)+#CR$
temp+"Local Time as French format : "+FormatDate(" %dd/%mm/%yy %hh:%ii:%ss",NTPTime+GetTimeZone()*60*60)+#CR$
MessageRequester("UTC et NTP",temp)
EndIf
;
; EPB