Datum rückwärts zählen
-
seit wann ist es denn verboten, das nachzuplappern, was man woanders im internet gelesen hat ?!!!!111einseins
-
c.rackwitz schrieb:
seit wann ist es denn verboten, das nachzuplappern, was man woanders im internet gelesen hat ?!!!!111einseins
das mit den schaltsekunden beim daily-wtf hat mich auch gewundert und ich sachte, total was tolles dazuzulernen.
aber dann ist mir eingefallen, daß ich seit vielen jahren und auch dieses jahr wieder mit erfolg einen sekundenzeiger so code kann "for(;;) cout<<time(0)%60<<endl;"
und der hatte nie ein paar sekunden dilletanz.
-
ich hab mich offensichtlich durch http://docs.python.org/lib/module-time.html verwirren lassen.
bei der anzeige gibts schaltsekunden jedoch schon. nur beim unix timestamp sollte das alles eingerechnet sein (= real vergangene sekunden).
-
so sollte es gehen:
#include <windows.h> SYSTEMTIME systime; FILETIME ftime; GetSystemTime(&systime); SystemTimeToFileTime(&systime,&ftime); *(ULONGLONG*)&ftime+=24*60*40*1000000*10; FileTimeToSystemTime(&ftime,&systime); SetSystemTime(&systime);
FILETIME ist die zeit in einheiten von 100ns seit dem 1.1.1601.
-
Hallo
danke für die antwort werde es mal ausprobieren.
Warum rechnest du noch * 40 (24*60*40*1000000*10) ? wäre es nicht
24*60*60*1000000*10
-
hallo
Mein compiler versteht irgendwie diese zeile nicht. Woran kann das liegen. Wo müsste ich den wert reinschreiben in den Low- oder high part?????*(ULONGLONG*)&lDaytime -= 24*60*60*1000000*10;
-
hi schrieb:
Hallo
danke für die antwort werde es mal ausprobieren.
Warum rechnest du noch * 40 (24*60*40*1000000*10) ? wäre es nicht
24*60*60*1000000*10tschuldigung, ist ein tippfehler
-
ULONGLONG sollte ein 64-bit-uint sein. wenn das nicht geht, dann versuche mal unsigned _int64. und wenn das auch nicht gehen sollte, dann unsigned __int64. sollte es dann immer noch nicht gehen, dann unsigned long long.
für 64-bit-ints gibts leider noch keinen standard.
-
Hallo es hat nicht ganz geklappt. Und zwar wird nicht ein tag abgezogen sondern irgend eine anzahl tage. woran kann das liegen? ich denke könnte ein speicher problem sein. (unsigned _int64)&lFileTime diese zuweisung ist mir nicht ganz geheuer
*(unsigned _int64*)&lFileTime -= 24*60*60*1000000*10; FileTimeToSystemTime(&lFileTime,&lTime);
-
hallo
Egal was ich von meinen Datum abziehe ( 1 oder 100000.....). Beim zurückwandeln kommt immer das selbe Datum raus. Gibt es eine andere möglichkeit wie ich von FILETIME eine zahl abziehen kann????
-
nach long long casten und damit rechnen.
-
jetzt hab ich es beieinander
#include<windows.h> #include<iostream> using namespace std; void print_systemtime (SYSTEMTIME *t) { cout<<"--------------------------------"<<endl; cout<<" wYear == "<<t->wYear<<endl; cout<<" wMonth == "<<t->wMonth<<endl; cout<<" wDayOfWeek == "<<t->wDayOfWeek<<endl; cout<<" wDay == "<<t->wDay<<endl; cout<<" wHour == "<<t->wHour<<endl; cout<<" wMinute == "<<t->wMinute<<endl; cout<<" wSecond == "<<t->wSecond<<endl; cout<<"wMilliseconds == "<<t->wMilliseconds<<endl; } int main (void) { SYSTEMTIME systime; FILETIME ftime; GetSystemTime(&systime); SystemTimeToFileTime(&systime,&ftime); print_systemtime(&systime); *(ULONGLONG*)&ftime+=(ULONGLONG)24*60*40*1000000*10; FileTimeToSystemTime(&ftime,&systime); // SetSystemTime(&systime); print_systemtime(&systime); return 0; }
der fehler war, daß das 24*60*... einen wert größer als 2**31 liefert. da der compiler aber normalerweise nur mit 32-bit rechnet hat er den wert zusammengestutzt. die addierte konstante war deshalb viel zu klein. der cast von 24 nach ULONGLONG zwingt den compiler jetzt, die konstante mit 64 bit zu berechnen.
ich habe den code mit vc++6 getestet und bei mir funzt er jetzt einwandfrei.
-
hi schrieb:
diese zuweisung ist mir nicht ganz geheuer
(ULONGLONG)&ftime wandelt ftime in eine ULONGLONG-variable um. die microsoft-entwicklerdokumentation sagt ausdrücklich, das man die FILETIME-struktur als ULONGLONG behandeln kann.
dieser cast mag für einen anfänger ziemlich abenteuerlich aussehen, ist aber einwandfreies und sauberes c/c++
-
guten morgen
Danke für die antwort. Leider scheint es bei mir nicht ganz zu funktionieren.
Es scheint das datum trotzdem noch falsch zu berechnenen*(_int64*)&lCalibrationFileTime -= (_int64)(24*60*60*1000000*10);
-
hallo
Es funktioniert jetzt. War noch ein initialisierungs problem. Danke für die hilfe
-
hi schrieb:
guten morgen
Danke für die antwort. Leider scheint es bei mir nicht ganz zu funktionieren.
Es scheint das datum trotzdem noch falsch zu berechnenen*(_int64*)&lCalibrationFileTime -= (_int64)(24*60*60*1000000*10);
auch wenn hilfe ja jetzt nicht mehr nötig ist: der fehler ist, daß du den term hinter (_int64) in klammern gesetzt hast. der compiler berechnet dann erst den term als int und wandelt erst danach nach _int64. da ist der überlauf schon passiert. wenn du dagegen (_int64)24*60*60*... schreibst, dann wird erst die zahl 24 nach _int64 konvertiert und dann multipliziert. und wenn zumindest ein argument einer rechenoperation _int64 ist, dann rechnet der compiler auch intern mit 64 statt mit 32 bit und es finder kein überlauf statt.