SYSTEMTIME und addition (solved) (@mods FAQ-Thema ?)



  • ich hab hier eine SYSTEMTIME struct und muss millisekunden hinzuaddieren, leider will das nicht so recht klappen, ich hab es wie in der hilfe beschrieben erst nach FILETIME konvertiert und als __int64 (borland) behandelt die millisekunden addiert und dann zurück nach SYSTEMTIME konvertiert, leider scheinen die konvertierungsroutinen die millisekunden zu ignorieren, es erhöt sich zwar der dekunden btw. minutenwert aber die millisekunden bleiben anch jeder operation gleich ... hat wer ne idee wie ich zuu ner SYSTEMTIME millisekunden addieren kann ? oder in welchen zeittyp ich es konvertieren kann damit ich in millisekunden damit rechnen kann ?

    es ist unbedingt notwendig das ich auch das datum mit JJJJ-MM-TT aus der berechneten Zeit erhalte!!!



  • Was für Methoden verwendest du denn zur Konvertierung? (laut MSDN sind sowohl SYSTEMTIME als auch FILETIME genau genug, um Millisekunden darstellen zu können - also vermute ich, daß die irgendwo unterwegs verloren gehen)



  • SystemTimeToFileTime(...)
    und
    FileTimeToSystemTime(...)

    und bei mind. einer von beiden bleiben die millisekunden auf der strecke, kennst jemand alternativen ?

    zur konvertierung / berechnung als über die og. Methoden / filetime



  • Mir würde spontan du einfallen, dich manuell durch die SYSTEMTIME-Struktur zu hangeln:

    void add(SYSTEMTIME& t,int ms)
    {
      t.wMilliseconds+=ms%1000;
      if(ms<1000&&t.wMilliseconds<1000) return;
      ms=(ms+t.wMilliseconds)/1000;
      t.wMilliseconds%=1000;
    
      t.wSecond+=ms%60;
      if(ms<60&&t.wSecond<60) return;
      ms=(ms+t.wSecond)/60:
      t.wSecond%=60;
    
      ...
      //das selbe Spiel für Stunden, Tage, Monate, Jahre
      //bei Tagen brauchst du eine kompliziertere Falunterscheidung, wenn du so weit kommst
    }
    

    Ansonsten kannst du die Millisekunden auch getrennt an der Konvertierung vorbeiführen, wo es nötig ist (wo es nötig ist, kannst du sehen, indem du das untere "Ende" der Strukturen betrachtest):

    SYSTEMTIME s;
    LARGE_INTEGER f;
    
    //ST->FT:
    SystemTimeToFileTime(&s,&f);
    f += 10*s.wMilliseconds;
    
    //FT->ST:
    FileTimeToSystemTime(&f,&s);
    s.wMilliseconds = (f/10)%1000;
    


  • also 1tens fällt schomma flach wegen issnich (fallunterscheidung in der dimension iss mir ehrlich gesagt bissl zu heftig)
    zu2tens, das will mir grad nich begreiflich werden, hilf mir da mal bitte auf die sprünge

    ich hab das so im moment

    SYSTEMTIME ServerSyncTime;
    unsigned long ServerSyncTick;
    
    __int64 TempFileTime;
    
    SYSTEMTIME ServerRecvTime;
    unsigned long RecvTick;
    
    SystemTimeToFileTime(&ServerSyncTime, &TempFileTime);
    TempFileTime += RecvTick - ServerSyncTick;
    FileTimeToSystemTime(&TempFileTime, &ServerRecvTime);
    
    printf ("%04d-%02d-%02d %02d:%02d:%02d.%03d",ServerRecvTime. .... ... ...);
    

    jetzt verrate mir warum ich zu TempFileTime das 10*wMilliseconds noch hinzuaddieren soll, das würde sich doch verheerend auf FileTimeToSystemTime() auswirken oder hab ich da grad brett am kopf ? (hab grad mein ersten kaffee intus vielleicht wirds mir bald klarer)
    ausserdem hab ich festgestellt das wahrscheinlich NUR FileTimeToSystemTime die millisekunden ignoriert, da ich ja im millisekundenbereich arbeite aber der wert wMilliseconds unangetastet bleibt! Leider kann ich nicht hundertprozentig sagen ob das auch für SystemTimeToFileTime() gilt.



  • Ceos schrieb:

    jetzt verrate mir warum ich zu TempFileTime das 10*wMilliseconds noch hinzuaddieren soll, das würde sich doch verheerend auf FileTimeToSystemTime() auswirken oder hab ich da grad brett am kopf ?

    Ich war mir nicht sicher, an welcher Stelle die ms-Angabe unter den Tisch fällt - wenn die Umrechnung ST->FT betroffen ist, mußt du 10*wMilliseconds addieren (FILETIME zählt in 100ns=0.1ms Schritten)

    ausserdem hab ich festgestellt das wahrscheinlich NUR FileTimeToSystemTime die millisekunden ignoriert, da ich ja im millisekundenbereich arbeite aber der wert wMilliseconds unangetastet bleibt! Leider kann ich nicht hundertprozentig sagen ob das auch für SystemTimeToFileTime() gilt.

    Das kannst du recht einfach überprüfen: nimm dir einen Zeitwert, der Millisekunden enthält und jage inh durch die Umwandlung - wenn im Ergebnis FT%10000==0 bzw. ST.wMilliseconds==0 übrig bleibt, mußt du die Werte berichtigen.



  • ach vergiss es , ich hab nur nich genau auf filetime geachtet, das arbeitet im 100ns bereich, also faktor 10000 genauer als systemtime! in dem moment sind meine winzigen abweichungen die unterhalb 1000ms liegen praktisch weggefallen!! ich habe ein refresh von 1s für das serversync gemacht, weswegen mir der fehler in der form nicht auffiel!

    [cpp]SYSTEMTIME ServerSyncTime;
    unsigned long ServerSyncTick;

    __int64 TempFileTime;

    SYSTEMTIME ServerRecvTime;
    unsigned long RecvTick;

    SystemTimeToFileTime(&ServerSyncTime, &TempFileTime);
    TempFileTime += ((RecvTick - ServerSyncTick)*10000);
    FileTimeToSystemTime(&TempFileTime, &ServerRecvTime);

    printf ("%04d-%02d-%02d %02d:%02d:%02d.%03d",ServerRecvTime. .... ... ...); [/cpp]

    so funktioniert es bestens

    gott wie ich dieses borland und seine kleingeschrieben "unwesentlichen" bemerkungen in der hilfe liebe .....



  • es wäre doch nicht schlecht das in die FAQ aufzunehemen, zwar nicht in der form aber auf jeden fall unter "wie rechne ich mit SYSTEMTIME" mal n thema dazu machen, ich habe beim suchen nämlich nichts hier gefunden.


Log in to reply