Funktion zu berechnen der Zeitdifferenz



  • Hallo Leute,

    ich hab mir eine Funktion geschrieben, die die Zeitdifferenz von zwei Zeiten ermittelt. Die Start- und Endzeit habe ich jeweils in folgender Form vorliegen: "30.01.2006 22:59".

    Hier ist mal die Funktion die ich mir geschrieben hab:

    void Ctv::CalcDuration(string *start, string *stop)
    {
    	SYSTEMTIME stStart={0}, stEnd={0}, stDiff={0};
    	FILETIME ftStart={0}, ftEnd={0}, ftDiff={0};
    	ULARGE_INTEGER uliStart={0}, uliEnd={0}, uliDiff={0};
    	char diffTime[6];
    	string temp;
    
    	if(*start=="N/A" || *stop=="N/A")
    	{
    		ProgInfo->duration="??:??";
    		return;
    	}
    
    	//SYSTEMTIME stStart füllen
    	stStart.wDay=atoi(start->c_str());
    	temp=start->substr(3,2);
    	stStart.wMonth=atoi(temp.c_str());
    	temp=start->substr(6,4);
    	stStart.wYear=atoi(temp.c_str());
    	temp=start->substr(12,2);
    	stStart.wHour=atoi(temp.c_str());
    	temp=start->substr(15,2);
    	stStart.wMinute=atoi(temp.c_str());
    
    	//SYSTEMTIME stEnd füllen
    	stEnd.wDay=atoi(stop->c_str());
    	temp=stop->substr(3,2);
    	stEnd.wMonth=atoi(temp.c_str());
    	temp=stop->substr(6,4);
    	stEnd.wYear=atoi(temp.c_str());
    	temp=stop->substr(12,2);
    	stEnd.wHour=atoi(temp.c_str());
    	temp=stop->substr(15,2);
    	stEnd.wMinute=atoi(temp.c_str());
    
    	//in FILETIME umwandeln
    	SystemTimeToFileTime(&stStart,&ftStart);
    	uliStart.HighPart=ftStart.dwHighDateTime;
    	uliStart.LowPart=ftStart.dwLowDateTime;
    	SystemTimeToFileTime(&stEnd,&ftEnd);
    	uliEnd.HighPart=ftEnd.dwHighDateTime;
    	uliEnd.LowPart=ftEnd.dwLowDateTime;
    
    	//Zeitdifferenz ermitteln
    	uliDiff.QuadPart=uliEnd.QuadPart-uliStart.QuadPart;
    
    	ftDiff.dwHighDateTime=uliDiff.HighPart;
    	ftDiff.dwLowDateTime=uliDiff.LowPart;
    	FileTimeToSystemTime(&ftDiff,&stDiff);
    	if(stDiff.wHour<10 && stDiff.wMinute<10)
    	{
    		sprintf(diffTime,"0%i:0%i",stDiff.wHour,stDiff.wMinute);
    		ProgInfo->duration=diffTime;
    	}
    	else if(stDiff.wHour<10 && stDiff.wMinute>9)
    	{
    		sprintf(diffTime,"0%i:%i",stDiff.wHour,stDiff.wMinute);
    		ProgInfo->duration=diffTime;
    	}
    	else if(stDiff.wHour>9 && stDiff.wMinute<10)
    	{
    		sprintf(diffTime,"%i:0%i",stDiff.wHour,stDiff.wMinute);
    		ProgInfo->duration=diffTime;
    	}
    	else 
    	{
    		sprintf(diffTime,"%i:%i",stDiff.wHour,stDiff.wMinute);
    		ProgInfo->duration=diffTime;
    	}    
    }
    

    Das ganze funktioniert auch.
    Meine Frage ist nun, ob man diese Differenz auch einfacher bzw. besser - also ohne über den Umweg SYSTEMTIME -> FILETIME und wieder zurück - lösen kann?

    Schon mal Danke für eure Hilfe.
    marpolin



  • Du könntest dir die Start- und Endedaten in einen "struct tm" einparsen (bin mir nicht sicher, ob es dafür eine automatisierte Lösung gibt) und dann mit man: difftime die Differenz (in Sekunden) ermitteln (und notfalls umrechnen auf Tage).


Anmelden zum Antworten