Millisekunden seit 1970



  • Hallo,

    ich suche eine Funktion, die mir die Millisekunden ausgeibt, die seit de, 1.1.70 0:00 Uhr vergangen sind.
    Mit GetSystemTime() kann ich das ermitteln und berechnen(Jahre*365+ Monate*30...), ist allerdings "zu umständlich". Gibt es da nen Möglichkeit das direkt auszugeben und in nen String umzuwandeln?
    Eure
    Danny



  • Nimm time, das gibt dir die Sekunden, die kannste dann umrechnen.



  • Ist das auf MilliSekunden genau? Hast du nen Link? Nach "time" zu googlen ist sehr aufwendig...



  • man gettimeofday ...

    The functions gettimeofday() ... gives the number of seconds and microseconds since the Epoch (see time(2)).



  • CTimeSpan würde ich sagen...

    LONGLONG sec;
    	CTime t = CTime::GetCurrentTime(); 
    
    	CTime time1970(1970,1,1,0,0,0,-1);
    	CTimeSpan difTime;
    	difTime = t - time1970;
    	sec=difTime.GetTotalSeconds();
    

    Micha



  • Mal der Vollständigkeit halber:
    welche Funktion brauch man denn um aus den Sekunden wieder ein Datum zu machen?
    Das Berechnen mit einer eigenen Funktion ist ziemlich umständlich und ich habe immer wieder Fehler drin.
    CTime und CTimeSpan bzw COleDateTimeSpan und COleDateTime scheinen nicht sowas anzubieten.
    Grüße
    Micha


  • Mod

    1. Wieso umständlich. COleDateTime ist ein simpler double mit dem man easy rechnen kann.
    2. Es gibt doch die Funktion Format.
    3. Kannst Du mit den entsprechenden Get... Funktionen Dir jeden Teil des Datums besorgen und selber ausgeben.



  • Hallo Martin,

    ich denke du hast mich nicht recht verstanden:
    ich muss die Zahl der Sekunden erstmal in ein timeformat umwandeln.
    Also ich hab die Sekunden vom 1.1.2000 z.B. 203958743 (nur ein Beispiel) Nun will Ich daraus Datum und Uhrzeit Errechnen (z.B. 13.5.2006 15:13:20).

    Das Ich die Sekundenzahl bekomme kann ich nicht beeinflussen oder ändern.

    Für Vorschläge bin ich dankbar
    Micha



  • schau dir doch mal localtime(), die kann die Sekunden seit 1.1.1970 in ein Datum umrechnen, denke das sollte das sein was du suchst



  • Ich mach das auch gerne mit FILETIME.
    Solange man nur Windows unterstützen muss, kann man mit FILETIMEs schön rechnen.
    Vorausgesetzt man schreibt sich ein paar kleine Hilfsfunktionen zum Konvertieren FILTEIME <-> uint64_t.



  • Durch das Nachforschen eurer Vorschläge hab ich nun doch eine Lösung mit CTime gefunden:

    CString t;
    long sec;                            //seconds from 1.1.2000
    CTime ff(0);			//sec from 1.1.1970
    CTime time2000(2000,1,1,0,0,0,-1);  //time 1.1.2000
    CTimeSpan dif1970_2000;
    dif1970_2000= time2000-ff;
    CTimeSpan dif_2000_X(sec);        //CTimeSpan starts from 1.1.1970!
    dif_2000_X += dif1970_2000;       //Add my startdate
    ff= ff+dif_2000_X;                //Finish (CTimeSpan -> CTime)
    
    t = ff.Format(_T("%d-%m-%y"));    //Output Example
    

    Anmerkung: in meinem obbrigem Post vom 31.8.2009 wird bei der Variablen time1970 ein ASSERT ausgelöst. Richtig: CTime time1970(0);
    Micha



  • oder so:

    #include <windows.h>
    #include <iostream>
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    unsigned long long FileTimeToInt(FILETIME ft)
    {
    	return (static_cast<unsigned long long>(ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
    }
    
    FILETIME IntToFileTime(unsigned long long t)
    {
    	FILETIME ft;
    	ft.dwHighDateTime = static_cast<DWORD>(t >> 32);
    	ft.dwLowDateTime = static_cast<DWORD>(t & 0xFFFFFFFF);
    	return ft;
    }
    
    static const unsigned long long FileTimeTicksPerMillisecond = 10000ull;
    static const unsigned long long FileTimeTicksPerSecond = FileTimeTicksPerMillisecond * 1000;
    static const unsigned long long FileTimeTicks1970 = 116444736000000000ull;
    
    int main(int argc, char** argv)
    {
    	long foo = 86400;
    	unsigned long long t = (foo * FileTimeTicksPerSecond) + FileTimeTicks1970;
    
    	FILETIME ft = IntToFileTime(t);
    	SYSTEMTIME st;
    	::FileTimeToSystemTime(&ft, &st);
    
    	std::cout << st.wYear << "-" << st.wMonth << "-" << st.wDay << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << "\n";
    
    	return 0;
    }
    

  • Mod

    der_micha1981 schrieb:

    Hallo Martin,

    ich denke du hast mich nicht recht verstanden:
    ich muss die Zahl der Sekunden erstmal in ein timeformat umwandeln.
    Also ich hab die Sekunden vom 1.1.2000 z.B. 203958743 (nur ein Beispiel) Nun will Ich daraus Datum und Uhrzeit Errechnen (z.B. 13.5.2006 15:13:20).

    Das Ich die Sekundenzahl bekomme kann ich nicht beeinflussen oder ändern.

    Für Vorschläge bin ich dankbar
    Micha

    Du hast nicht verstanden wie COleDateTime zum Beispiel funktioniert.

    Wenn Du ein Datum in COleDateTime Format hast, kanst Du damit machen was die Klasse bietet.

    Ansonsten wenn Du MSek seit 1.1.1970 00:00 hast, dan lässt sich dies in COleDateTime so umwandeln und in CTime. CTime sind einfach Sekunden seit 1.1.1970. Also einfach /1000 und zuweisen.

    Bei COleDateTime einfach die MSec in Tage umrechnen

    COleDateTime time = COleDateTime(1970,1,1,0,0,0)+COleDateTimeSpan(msec/1000.0/60/60/24)
    

Anmelden zum Antworten