time lekerdezese, egy napos ciklusidovel

Fórumok

sziasztok
szeretnem az aktualis idot kimenteni egy valtozoba, hogy az 0-86400.00 -ig terjedjen. (ami24*60*60)
a timeGetTime nem jo, mert DWORD erteket ad vissza ami 2ad32, ami kb 49.71 napos
ciklusidot jelent.
tud valaki segiteni?

Hozzászólások


#include

unsigned int sec;

...
sec = time(NULL) % 86400;
...

BIOS óra időzónájától ez teljesen független. A time() és a gettimeofday() egyaránt az 1970 jan. 1 0:00 UTC óta eltelt (nem szökő) másodpercek számát adja vissza, amit modulo 86400 nézve megkapod az UTC időzóna szerint éjfél óta eltelt másodperceket. Ha helyi idő érdekel, irány a localtime() függvény, ami az előbbi értéket szétdarabolja neked év-hónap-nap-óra-perc-stb. mezőkre.

A bios időt lehet helyi időre is, meg UTC-re is állítani. A rendszer boot szkriptjei a bios idő alapján állítják be a rendszer idejét, a bios idejét valami konfig fájl alapján vagy helyi időként, vagy UTC-ként értelmezve. Ergó lehet kétféle jó és kétféle rossz beállítást produkálni. Feltételezem, hogy a rendszer jól van beállítva - egyéb esetben ugyanis semmit sem lehet tudni arról, hogy ezek a függvények mit is adnak vissza. Ebben az esetben pedig teljesen lényegtelen, hogy a biosban milyen időzóna van.

Egyébként... mi az a timeGetTime? És mi az a dword? :)
Lehetséges, hogy itt a Hungarian Unix Portalon elfelejtetted megemlíteni, hogy kérdésed nem Unixra vonatkozik? Vagy én vagyok tök hülye?

igazad van, bocsi
kozben meglett a megoldasom, kosz a valaszokat
megoldasom:

...
SYSTEMTIME st;
GetSystemTime(&st);
double timestamp;

timestamp = 60*60*(st.wHour+1)+60*(st.wMinute)+st.wSecond+0.01*(st.wMilliseconds/10);
....

az ora erteket gondolom BIOS szerint veszi, mivel egy oraval kevesebbet ad a mostani idonel,
ezert van ott a +1.
Es szazad masodpercekig valo felbontasra volt szuksegem, azert van a milisec alakitva.

Nem a BIOS-ból szedi, hanem saját órája ketyeg. A +1-et pedig csak úgy odabiggyeszteni, mert így működik... hát... aztán majd csodálkozol tavasszal amikor hirtelen már nem működik jól a progid...

... szerk: arról nem is beszélve, hogy az a +1 miatt nem is a 0..86399 intervallumban kapod meg az értéket!

Nem az erofeszitesrol, hanem a hozzaallasrol van szo. Velem nagyon sokszor elofordul, hogy regi kodreszleteket hasznositok ujra, amelyeknel igazabol mar fogalmam sincs, hogy hogy mukodnek. Egy ilyen "agyondokumentalt" (ironia) kod kesz remalom tud lenni, ha valami hiba itt jelzodik ki.
En ilyen esetben legalabbis azt csinalnam, hogy csinalnek egy tcorr valtozot, abba mentenem le az 1-et, es melle kommentbe odairnam, hogy "TODO: investigate why it needed". Igy tudni fogom, hogy ez egy ilyen misztikus 1-es, mert csak.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Annyit hozzátennék, hogy a UTC / 86400 osztás maradéka nem feltétlenül adja ki az adott napi másodperc értéket, mert a Föld fordásidejének ingadozása miatt néha beiktatnak egy plusz vagy minusz másodpercet a rendszerbe.

A biztos megoldás az, ha valami dátumparszoló libet használsz, ami UTC-t dátumra konvertál, és abból olvasod ki a napi másodperc értéket. Ez a jövőben bevezetett korricációs másodperceket is kezelni fogja automatikusan, ha az lejön a gépre update formájában.

Windowsról nem tudok nyilatkozni, Posix szabvány szerint, akár tetszik, akár nem, az időt a szökőmásodperc figyelmen kívül hagyásával mérjük. Tehát Linux alatt például a 86400-zal osztás (sajnos? szerencsére? ki-ki döntse el maga) jól működik.

Egyébként eddig huszon-egynéhány plusz másodperc volt, és mínusz egy sem.

+1

sőt, legszebb az lenne, ha API-szinten két különböző funkció lenne arra, hogy
- aktuális időt lekérdezzünk
- megadott időtartam múlva eseményt kapjunk
Lehet, hogy van is, most nincs időm utánanézni. :)

A másodiknak működnie kell függetlenül attól, hogy
- közben valaki átállította a rendszeridőt
- közben szökőmásodperc volt
- közben másik időzónába léptünk
- közben téli-nyári váltás volt
Sőt, az se baj, ha a rendszer két külön módszerrel méri az időt.

Szerk: az UTC használata a 4 pontból a 3. és 4. pontokat megoldja, de az első kettőt nem.

Linuxban van ilyen "monotonic" óra, és tudtommal minden értelmes függvény ami várakozik az ezt használja, tehát nem érzékeny a rendszeróra átállítására. Gyakorlatilag a bootolás óta eltelt számolja, vagy valami ilyesmi. Lásd például a clock_gettime() kézikönyvet.