Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zmiana czasu systemowego


Rekomendowane odpowiedzi

Opublikowano

Dziękuję za linki, wcześniej już próbowałem tych funkcji tylko że (według tego przykładu) nie działają one na Win7 przez 'system security'.

 

Da się jakoś uruchamiać skrypty z uprawnieniami administratora?

Opublikowano

Jednak nie wszystko śmiga...

Mam 2 problemy.

 

Pierwszy: Czemu ten kod;

#RequireAdmin
#include <Date.au3>

$tNew = _Date_Time_EncodeSystemTime(@MON, @MDAY+1, @YEAR, @HOUR, @MIN, @SEC)
				If Not _Date_Time_SetSystemTime(DllStructGetPtr($tNew)) Then																			
				MsgBox(4096, "Error", "System clock cannot be SET" & @CRLF & @CRLF & _WinAPI_GetLastErrorMessage())	
				Exit																																					
EndIf

Nie działa bez tego;

				If Not _Date_Time_SetSystemTime(DllStructGetPtr($tNew)) Then																			
				MsgBox(4096, "Error", "System clock cannot be SET" & @CRLF & @CRLF & _WinAPI_GetLastErrorMessage())	
				Exit	  

Drugi: I czemu ten kod przesuwa zegar o dwie godziny do przodu?

Opublikowano

Eem, EncodeSystemTime zwraca tylko pointer do struktury, który można potem dalej użyć.

SetSystemTime faktycznie zmienia czas.

 

U mnie kod działa poprawnie, przesuwając dzień na następny, nie widzę jakby on miał przesuwać o dwie godziny.

Ta sygnatura jest pusta.

Opublikowano

Zajmuję się AutoIt'em od kilku dni, więc niewiem co to "pointer" czy "struktura", ale sądze że za kilka mięsięcy (lat) Ci podziękuję za tę odpowiedź :)

 

 

Dziwne,

 _Date_Time_EncodeSystemTime(@MON, @MDAY-1, @YEAR)

Taki kod co prawda cofa zegar o jeden dzień, ale i niezależnie jaką godzinę ustawię w systemie, ZAWSZE zmienią ją na 02:00.

Opublikowano

#RequireAdmin
#include <Date.au3>

$tNew = _Date_Time_EncodeSystemTime(@MON, @MDAY+1, @YEAR, @HOUR, @MIN, @SEC)
If Not _Date_Time_SetLocalTime(DllStructGetPtr($tNew)) Then
MsgBox(4096, "Error", "System clock cannot be SET" & @CRLF & @CRLF & _WinAPI_GetLastErrorMessage())
Exit
EndIf

 

Kod którego szukasz. SetSystemTime ustawia czas systemowy, lokalny dla Polski ( letni ) jest GMT+2 stąd przesunięcie o dwie godziny ( wcześniej sam go nie zauważyłem, dopiero nie zorientowałem się, że jest trochę za ciemno jak na siedemnastą). Używaj SetLocalTime.

 

A sama w sobie funkcje EncodeSystemTime nic nie robi, tylko zwraca zmienną używaną w innych funkcjach Date_Time.au3

Ta sygnatura jest pusta.

Opublikowano

Wybacz że cię męcze pytaniami, ale mam kolejne...

 

Jeśli chcę przesunąc czas o 30 sekund, a do kolejnej minuty pozostało mniej niż 30 sekund, wyskakuję błąd. (pewnie dlatego że liczba sekund nie może przekraczać 60)

Wymyśliłem więc taki patent:

 

 

 

If @SEC < 30 Then
  DoPrzodu()
Else
  $czas1 = 60 - @SEC
  Krok1()
  $czas2 = 30 - $czas1
  Krok2()
EndIf



Func DoPrzodu()

$tNew = _Date_Time_EncodeSystemTime(@MON, @MDAY, @YEAR, @HOUR, @MIN, @SEC+30)
If Not _Date_Time_SetLocalTime(DllStructGetPtr($tNew)) Then
MsgBox(4096, "Error", "System clock cannot be SET" & @CRLF & @CRLF & _WinAPI_GetLastErrorMessage())
Exit
EndIf

EndFunc


Func Krok1()

$tNew = _Date_Time_EncodeSystemTime(@MON, @MDAY, @YEAR, @HOUR, @MIN, @SEC+$czas1)
If Not _Date_Time_SetLocalTime(DllStructGetPtr($tNew)) Then
MsgBox(4096, "Error", "System clock cannot be SET" & @CRLF & @CRLF & _WinAPI_GetLastErrorMessage())
Exit
EndIf

EndFunc

Func Krok2()

$tNew = _Date_Time_EncodeSystemTime(@MON, @MDAY, @YEAR, @HOUR, @MIN, @SEC+$czas2)
If Not _Date_Time_SetLocalTime(DllStructGetPtr($tNew)) Then
MsgBox(4096, "Error", "System clock cannot be SET" & @CRLF & @CRLF & _WinAPI_GetLastErrorMessage())
Exit
EndIf
EndFunc

 

 

 

Ale błąd nadal wyskakuję.

Opublikowano

min += int((sec+30)/60)
sec = mod(sec+30,60)

taki mój kaprys, nie lubię niepotrzebnych ifów.

 

możesz sobie zamiast pierwszej linii dać, że jeśli sec+30>=60 to zwiększa min o 1

 

do tego przydałoby się sprawdzanie jeszcze czy nie przekroczono godzin, potem dni, itd...

 

 

@edit.

albo prostsze rozwiązanie

_DateAdd

Opublikowano

Jest ponad dwa tuziny funkcji _Date_Time_*. Któraś na pewno realizuje to, co chcesz osiągnąć ( to jest przesunąć datę o daną liczbę sekund ). Przejrzyj wszystkie w dokumentacji.

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...