time lekerdezese, egy napos ciklusidovel

 ( atisz | 2009. november 11., szerda - 20:09 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

#include

unsigned int sec;

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

ok, csak ugy szeretnem hogy a szam az ejfeltol eltelt masodperceket/szazadmasodperceket reprezentalja

A fenti programban az éjféltől eltelt másodperceket kapod a sec változóban.
Ha századmásodpercek is kellenek akkor:

#include

unsigned int sec, sec_100;

struct timeval t;
...
gettimeofday(&t,NULL);

sec = t.tv_sec % 86400;
sec_100 = (t.tv_usec+5000) / 10000;
...

Az első példában time.h, a másodikban sys/time.h szerepel az include-ban.

sec = t.tv_sec % 86400;
sec_100 = (t.tv_usec+5000) / 10000;

Spot the bug! :-)

Most elbizonytalanítottál, ezért kipróbáltam. Szerintem jó.

Átlagosan 200-ból 199-szer jó.

Szerintem ez pont ezt adja vissza mp-ben, ha a géped órája (BIOS-ban) helyi idő szerint jár. Ha UTC szerint megy, akkor +3600 mp.

-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5

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.

És ha a BIOS-t helyi időre állítod be, akkor a helyi időt hiszi UTC-nek.

-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5

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.

Debianban a /etc/default/rcS fájlban lehet kérni, hogy a hardveróra UTC-ben ketyegjen, ami jó ötlet, kivéve, ha Windows-t is bootol az a gép.

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!

csak egy par meres erejeig kell a dolog, egyebkent meg le lehet kezelni azt is nem nagy erofeszitessel..de azert kosz a valaszert

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.

Ebben az a jó, hogy aki majd utánad újraírja ezt a kódot, az tuti fogni fogja a fejét, hogy ez meg mi :-)

Addigra mar ki szoktam fixalni az ilyent. En nem irok ilyeneket csak akkor, ha idoszuke van, es nekem a IDE alul kijelzi a TODO kommenteket.
--

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

Dehat van GetLocalTime() fuggveny is.
Illetve ezt is erdemes elolvasni:
http://blogs.msdn.com/oldnewthing/archive/2005/09/02/459952.aspx

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.