UTC Zeit ist Float?????



  • Hi,

    ich soll für Objekte (Auto, Zug, Fußgänger,...) Kollisionen berechnen.
    Jedes Object hat eine Zeitangabe vom Typ "float".
    z.B.: Cars(0)->point(0)->utc_time. Eine Ausgabe mit printf(" Zeit Auto: %f " , Cars(0)->point(0)->utc_time ); ergibt: 40597.960938. Diese zeit soll in eine GMT Zeit umgewandelt werden. Wenn ich ein Datum bekomme, dann hab ich dafür eine Lösung:

    double convertEpocTimeUTCGMT(const char* DateTime, bool switchToStandardTime){
    	 struct tm  dt = {0,0,0,0,0,0,0,0,0,0,0};
    	 char* w1;
    	 w1= (char*)malloc( strlen(DateTime)+1);
    	 w1 = strcpy( w1, DateTime);
    
    	 char* pGLobalDateTokenList = strtok(w1, DateTimeDelimiter);
    	 char* pGlobalTimeTokenList = strtok(NULL, DateTimeDelimiter);
    
    	 if(strlen(DateTime) < 10) return 0;
    
    	 if(pGLobalDateTokenList){
    		char* pDateTokenList = strtok(pGLobalDateTokenList, "-");
    		if(pDateTokenList){
    			dt.tm_year =  atoi(pDateTokenList) - 1900;
    			pDateTokenList = strtok(NULL, "-");
    			dt.tm_mon = atoi(pDateTokenList) -1;
    			pDateTokenList = strtok(NULL, "-");
    			dt.tm_mday =  atoi(pDateTokenList);
    		}			
    	}
    
    	if(pGlobalTimeTokenList){
    		char* pTimeTokenList = strtok(pGlobalTimeTokenList, ":");					
    		if(pTimeTokenList){
    			if(switchToStandardTime == false)
    				dt.tm_hour =  atoi(pTimeTokenList)+1; //time change! switch to summertime
    			else
    				dt.tm_hour =  atoi(pTimeTokenList); //time change! return to standard time
    			pTimeTokenList = strtok(NULL, ":");
    			dt.tm_min = atoi(pTimeTokenList);
    			pTimeTokenList = strtok(NULL, ":");
    			dt.tm_sec = atoi(pTimeTokenList);
    		}				
    	}
    
    	return (double)mktime(&dt);  //UTC / GMT
    }
    

    Wie löse ich das mit dem Float?

    Gruß
    Franky



  • Falsches Forum. Das ist eher C-Code.


  • Mod

    Tachyon schrieb:

    Falsches Forum. Das ist eher C-Code.

    Auch in C würde das niemand so machen. Schließlich gibt's das schon in der Standardbibliothek.

    @Threadersteller:

    1. Guck dir mal time.h an!
    2. Was willst du eigentlich? Ehrlich gesagt, weiß ich gar nicht was du vor hast, das ist alles ein bisschen wirr:
      - Was hat das mit der Kollisionsberechnung zu tun?
      - Wieso willst du UTC in GMT umrechnen? Die beiden unterscheiden sich doch nur um Sekundenbruchteile
      - Was hat diese Umrechnung mit deinem Code zu tun? Dein Code bezieht sich auf die Umwandlung von Zeichenketten in eine numerische Zeitangabe.


  • Hi,

    ich bekommme einen Wert (Zahl) vom Typ float. Diesen will ich in ein gültiges Datum formatieren. Weil "40597.960938" irgendwie nicht so aussieht wie:
    Jahr, Tag, Monat, ..

    Für das Datumsformat (in dem Codebeispiel) wenn es das schon in einer Standardbibliothek gibt, welches ist es denn? Weil dann könnte ich den Code ja vereinfachen.

    Gruß
    Franky


  • Mod

    FrankTheFox schrieb:

    Für das Datumsformat (in dem Codebeispiel) wenn es das schon in einer Standardbibliothek gibt, welches ist es denn?

    Das kannst du dir aussuchen:
    http://www.cplusplus.com/reference/clibrary/ctime/strftime/
    Oder auch ein Standardformatierung benutzen:
    http://www.cplusplus.com/reference/clibrary/ctime/asctime/
    Lies dir doch einfach mal die Referenz zu time.h durch! Die ist nicht lang.



  • Hi,

    OK! Stimmt der Beispiel-Code ist nicht durchdacht. Ich habe den etwas umgeschrieben....

    long Timestamp(char* CurrentTime)
    {
    	std::string str = CurrentTime;
    	time_t t;
    	struct tm * DateTime;
    
    	t = time(NULL);
    	DateTime = localtime(&t); 
    
    	if(str.length() == 8) 
    	{
    		DateTime->tm_hour = atoi(str.substr(0,2).c_str());
    		DateTime->tm_min = atoi(str.substr(3,2).c_str());
    		DateTime->tm_sec = atoi(str.substr(6,2).c_str());	
    		return (long)mktime(DateTime);
    	}
    	else if(str.length() == 24)
    	{
    		DateTime->tm_year = atoi(str.substr(0,4).c_str()) - 1900;
    		DateTime->tm_mon = atoi( str.substr(5,2).c_str()) -1;
    		DateTime->tm_mday = atoi(str.substr(8,2).c_str());
    		DateTime->tm_hour = atoi(str.substr(11,2).c_str());
    		DateTime->tm_min = atoi(str.substr(14,2).c_str());
    		DateTime->tm_sec = atoi(str.substr(17,2).c_str());	
    		return (long)mktime(DateTime);
    	}
    	else  return -1;
    }
    

    Geht es beim Code noch besser? Oder ist das noch genauso schlecht?

    Ich habe
    a) hh🇲🇲ss als Zeit und (nehme das aktuelle Datum)
    b) YYYY-MM-TThh🇲🇲ss.000Z (bsp.:"2008-09-26T01:51:42.000Z")

    und erhalte richtiger Ergebnisse.

    nun möchte ich einen FLoat -> HH:MM:SS. Ich weiß nicht wie ich anfangen soll?

    Gruß
    Franky



  • Hi,

    also nun mein Lösungansatz:

    long Timestamp(float CurrentTime)
    {
    
    	time_t t;
    	struct tm * DateTime;
    	int hour, secs, minutes;
    	int intTimeValue =  (int) CurrentTime; 
    
    	hour = intTimeValue / 3600;
    	minutes = (intTimeValue - (intTimeValue / 3600) * 3600 ) / 60;
    	secs = intTimeValue % 60;
    
    	printf(">>>>   %02i %02i %02i", hour, minutes, secs);
    
    	t = time(NULL);
    	DateTime = localtime(&t);
    
    	DateTime->tm_hour = hour;
    	DateTime->tm_min = minutes;
    	DateTime->tm_sec = secs;	
    
    	return (long)mktime(DateTime);
    }
    

    Ich denke wenn die Funktion int zurück gibt reicht das auch um den Timestamp aufzunehmen....

    Und keine Kommentare?????

    Gruß
    Franky


Anmelden zum Antworten