[c] dwHighDateTime in Echtes Datum Wandeln

Cusco

Erfahrenes Mitglied
Hi,

wie Wandel ich ein DWORD dwHighDateTime in ein Echtes Datum-Format unter Windows? DIe Variable befindet sich in der FILETIME-Struktur.

Der Komplette Path wäre bei mir dann, glaub ich:

FindData.ftLastWriteTime.dwHighDateTime

Das Datum Möchte ich als string zurückhaben, es gibt doch bestimmt ne funktion die das nach Windows-Einstellung übernimmt, nur leider habe ich sie bis her nicht gefunden. :(
 
Hi.

Die FILETIME Struktur enthält 2 DWORDs die zusammen die entsprechende Zeit repräsentieren. Um die FILETIME in eine SystemZeit zu konvertieren kannst du einfach die Funktion FileTimeToSystemTime benutzen, um es in die lokale Zeit (entsprechend der Zeitzone etc.) umzuwandeln dann noch SystemTimeToTzSpecificLocalTime.

/edit: Achso, und die System Zeit ist eine Struktur die du dann ganz nach belieben mit printf o.ä. ausgeben kannst.

/edit2: Du kannst auch die Funktion GetTimeFormat benutzen, da kannst du eine bestimmte Locale angeben und eine System Zeit die formatiert werden soll - das Ergebnis wird in einen String geschrieben.

Gruß
 
Zuletzt bearbeitet:
Ah Gut werde ich Testen :) Das mitr der Systenzeit war mir seit gestern bekannt, ich hatte folgene Funktrion zusammen gebastelt:

Code:
TCHAR *sna_datumzeit(TCHAR *zeitstring){  
    struct tm *ltime;
    time_t ttime;
   
    time(&ttime);
    ltime = localtime(&ttime);
    #ifndef UNICODE
    sprintf(zeitstring,TEXT("%02d.%02d.%d (%02d:%02d:%2d)"),
     ltime->tm_mday,ltime->tm_mon+1,ltime->tm_year+1900, ltime->tm_hour,
     ltime->tm_min,ltime->tm_sec);
     #else
     wsprintf(zeitstring,TEXT("%02d.%02d.%d (%02d:%02d:%2d)"),
     ltime->tm_mday,ltime->tm_mon+1,ltime->tm_year+1900, ltime->tm_hour,
     ltime->tm_min,ltime->tm_sec);
    #endif 
    return (zeitstring);}

Ich wuste nur noch nix von der Systemzeit-Umwandlungsfunktion die Du hier schriebst :)
 
Also irgendwie kriege ich das nicht gebacken :(
Es kommt zwar kein Compilerfehler (mehr) aber im String wird nur Müll zurück gegeben, wie es aussieht.

Code:
SYSTEMTIME lpSystemTime;
int TimeFehler;
TCHAR szFileTime[101];

FileTimeToSystemTime(&FindData.ftLastWriteTime,&lpSystemTime);
TimeFehler = GetTimeFormat(LOCALE_USER_DEFAULT,
LOCALE_NOUSEROVERRIDE|TIME_FORCE24HOURFORMAT,
&lpSystemTime,
TEXT(""),
szFileTime,
sizeof(szFileTime));

if((TimeFehler == ERROR_INVALID_PARAMETER) || (TimeFehler == ERROR_INVALID_PARAMETER) || (TimeFehler == ERROR_INVALID_FLAGS))
{printf("TimeFehler!!\n");}

Worin liegt der Fehler?

EDIT: Achso die Zeitausgabe soll nach User-Einstellung erfolgen, ich weiss nicht ob ichh die richtigen Flags dazu angegeben habe.
 
Zuletzt bearbeitet:
Das ist jetzt nur geraten, aber vielleicht solltest Du als 'lpFormat' - Parameter keinen Leerstring (TEXT("")) übergeben sondern NULL oder einen gültigen Format-String.
 
jokey2 hat gesagt.:
Das ist jetzt nur geraten, aber vielleicht solltest Du als 'lpFormat' - Parameter keinen Leerstring (TEXT("")) übergeben sondern NULL oder einen gültigen Format-String.

Das hat mich schonmal Weiter gebracht :) Nun gibt er mir anscheint die Uhrzeit aus. Ich möchte aber das Datum, wie stell ich das an? Ich glaub ich habe dazu aber die Falsche Funktion genommen oder?

EDIT: OK Hat sich schon erledigt, GetDateFormat ist dafür gedacht :)
 
Zuletzt bearbeitet:
Dazu nimmst Du GetDateFormat(...) mit den gleichen Parametern. Nur die Flags und der Formatstring sind anders (->MSDN).
 
jokey2 hat gesagt.:
Dazu nimmst Du GetDateFormat(...) mit den gleichen Parametern. Nur die Flags und der Formatstring sind anders (->MSDN).

Ja habe ich auch gerade rausgefunden :)
So Danke euch beiden das Themna ist nun erledigt :)
 
Doch noch ne ne Nervige Frage zum Hintergrung. Wann beginnt die Zeitrechnung unter Windows und bis wann geht die? Vom Amiga weiss ich das SIe 1976 oder 1979 anfängt und bis zum Jahr 2028 oder so gehen kann.
 
Kannst Du doch ganz einfach rausfinden: Setzt Deine SYSTEMTIME auf 0 und schau, was Dir GetDateFormat und GetTimeFormat ausgeben. ;-)
 
Zurück