Äquivalent zu 'gmtime_s()' und '_mkgmtime()' unter Windows CE



  • Da ich die beiden Funktionen unter Windows CE anwenden muss und diese leider nicht unterstüzt werden suche ich das passende Gegenstück dazu.

    Laut Doku ist '_mkgmtime()' für die Verwendung auf 64-Bit Systemen vorgesehen. Leider kennt Visual Studio 2008 auch kein '_USE_32BIT_TIME_T' oder '_mkgmtime32()', daher muss ich wohl wirklich auf etwas Anderes ausweichen.



  • was möchtest du denn damit machen?

    du kannst dir mal time(), tm-struktur, time_t anschauen... vielleicht kannst du direkt in eine struktur hineinschreiben...

    gmtime_s() -> konvertiert ja eine zeit in eine struktur...

    evt. hilft dir auch "__int64" - datentypen... wenn du mir sagst was für einen datentyp du mit gmtime_s() "konvertieren" willst könnte ich dir genau sagen was dir hilft... 😃

    hinweis:
    hast mal versucht die werte einfach direkt in die struktur zuschreiben?

    also so

    xx.tmyear=jahre;
    xx.tmmon=monate;
    

    etc... wenn du die zahlen richtig "überträgst" und das vorliegnde format (also binär, hex ,dezimal, ...) übereinstimmt funktioniert auch soetwas...

    🙄

    hoff das hat dir geholfen... für mehr output bitte mehr input...
    welche datenformat ausgangslage und welches struktur-format willst du?



  • edit: hab den "_" bei xx.tm_year und so vergessen... sry ... 😞



  • Ich benutze die beiden Funktionen um ein Datum in time_t (Alle Datums-Informationen in einem Wert enthalten) zu konvertieren und umgekehrt.

    Ich habe mit den Strukturen experimentiert. Laut Doku ist der Wert in time_t die Anzahl an Sekunden seit dem 1.1.1970. Hatte gehofft dass es leicht wäre die Sekunden in einer eigenen Funktion selbst zusammen zuzählen. Das geht leider nicht - wahrscheinlich weil nicht jeder Monat 31 Tage hat, Schaltjahre, usw...

    Ich kann das Ergebnis ja prüfen indem ich meine Rechnung durch '_mkgmtime()' bestätigen lasse.



  • time_t -> unixtimestamp (1.1.1970 in sek)
    - hat übrigens auch jahr, monat etc...

    willst du die lokale systemzeit?
    welches format hast du denn als ausgangslage ...?
    also in welchem zeitformat liegt deine zeitangabe vor??
    dann kann ich mal schauen ob ich dir da helfen kann?

    falls du die lokale systemzeit willst kannst du es z.B. direkt so machen:

    time_t beispiel_time_t ;
    //time(NULL) -> akt. systemzeit in sek seit 1.1.1970
    beispiel_time_t = time(NULL);
    


  • Ich lese Variablen von einer SPS (CoDeSys) aus, die im Format DT (DayTime) und DATE sind. Nullpunkt ist immer 1.1.1970.

    Teiten umrechnen sind gar kein Problem, nur das Datum bekomme ich nicht umgewandelt.
    Ich muss immer das jeweile Format (DT, DATE) in die Zeitstruktur umwandeln (struct tm) um auf Jahr, Monat, Tag, Stunden, ... usw zuzugreifen können. Und umgekehrt will ich dann Jahr, Monat, ... usw in das jeweilige Format umwandeln um den Wert der Variablen zu beschreiben.



  • mhh ok ...

    vll hilft dir das... :

    http://www.44342.com/windows-ce-f1020-t1615-p1.htm

    ich schau nochmal vielleicht find ich noch was anderes...
    aber wie es aussieht führt der "mktime" unter windows ce aus...
    ich kann dies nur leider gerade nicht testen...
    falls dies dir nicht hilft schau ich nochmal... 🙂
    lg



  • Danke, hat aber leider nicht zum Erfolg geführt:

    'mktime()' unter CE ist kein Problem, aber '_mkgmtime()' klappt nicht. Auch in "time.h" ist es nicht definiert (Dort findet man nur 'mktime()').

    Ich habe jetzt folgenden Beitrag gefunden:
    http://stackoverflow.com/questions/12353011/how-to-convert-a-utc-date-time-to-a-time-t-in-c

    Dort zeigt jemand wie man 'mkgmtime()' nachbauen kann - klappt auch sehr gut!

    Ich denke dass man den Wirksinn der Funktion umkehren kann um 'gmtime_s()' nachzubauen. Sonst melde ich mich nochmal.

    Danke für die Unterstützung! 🙂



  • Red Skall schrieb:

    Danke, hat aber leider nicht zum Erfolg geführt:
    'mktime()' unter CE ist kein Problem, aber '_mkgmtime()' klappt nicht. Auch in "time.h" ist es nicht definiert (Dort findet man nur 'mktime()').

    Ich habe jetzt folgenden Beitrag gefunden:
    http://stackoverflow.com/questions/12353011/how-to-convert-a-utc-date-time-to-a-time-t-in-c

    Dort zeigt jemand wie man 'mkgmtime()' nachbauen kann - klappt auch sehr gut!

    Ich denke dass man den Wirksinn der Funktion umkehren kann um 'gmtime_s()' nachzubauen. Sonst melde ich mich nochmal.

    Danke für die Unterstützung! 🙂

    😃
    mir ging es eigentlich auch eher um das prinzip wie er mktime() nutzt...

    außerdem dachte ich du willst time_t(unixzeistempel seit 1.1.1970, in sekunden) ... über ein time_t format kannst du auch wie bei tm auf die einzelnen jahre tage monate etc... zugreifen und dir dann ein "datum" zusammenbauen wie du es haben willst... 😉

    mktime() liefert dir ein time_t format zurück...?
    wenn du dann time_t hast ist tm-struktur nicht mehr weit entfernt... 🙂
    (dachte du wolltest eig time_t und tm - formate?)

    warum nutzt du nicht einfach "mktime()"- warum willst du das so kompliziert machen? 😮



  • hier macht er doch eine zeit umwandlung fast genau wie du sie brauchst:
    http://www.cplusplus.com/reference/ctime/mktime/

    musst du halt nur auf dein DATETIME-Format anpassen...
    aber DT ist ja auch seit 1.1.1970 da ist das docha lles eigentlich nur werte übertragen...? -> evt. sind nicht alle variablen in der struktur gleich... aber solange du nur ein datum möchtest sollte dies kein problem sein...

    mal ne ganz grundsätzliche frage warum willst du überhaupt ein DATETIME-Format in ein tm oder time_t format schreiben?

    du kannsta uch ein DATETIME-Format direkt weiter verwenden ( ist meiner meinung nach auch zu empfehlen, anstatt andauert hin und her zu konvertieren... )

    schau mal hier... ganz unten ein Code-Beispiel + Funktionsübersicht ...
    http://msdn.microsoft.com/de-de/library/system.datetime(v=vs.110).aspx
    vll kannst du dir "mktime()" oder "gmtime_s()" ja komplett sparen...? 🙄 oder brauchst du speziell ein tm oder time_t format für weitere funktionen oder ähnliches? 😕



  • Danke, aber der Kerl benutzt 'mktime', ich brauche aber die UTC Time ('gmtime_s()').

    Ich brauche die ganzen Werte für die Anzeige für den Benutzer oder wenn der Benutzer Werte eingibt. Ansonsten benutze ich immer den "Rohwert".

    Das mit dem "per Hand" konvertieren (in beide Richtungen) klappt sehr gut, trotzdem gucke ich mir 'DateTime' nochmal an.

    Besten Dank!



  • Red Skall schrieb:

    Danke, aber der Kerl benutzt 'mktime', ich brauche aber die UTC Time ('gmtime_s()').

    time_t -> utc
    http://www.cplusplus.com/reference/ctime/time_t/

    jop ... du kannst auf die time_t in eine tm datenstruktur umwandeln und dann auch einzeln auf die struktur elemente zugreifen und dir so ein datum zusammen bauen...

    mit "localtime" füllst du die tm struktur mit der time_t struktur...
    http://www.cplusplus.com/reference/ctime/localtime/

    dann baust du es dir UTC-Format-Style zusammen 😉 ... ist vll etwas aufwendig sollte aber auch unter windows ce laufen 😉 ...

    hier nochmal ein beispiel mit der akt. Zeit vom system, aber vom prinzip...:

    //Zeitdatenstruktur - time_t
    time_t xxx;
    
    //Zeitdatenstruktur - tm
    tm *xxx_tm;
    
    //time(NULL) -> unixtimestamp 1.1.1970 in sek (jetzt aktuelle zeit, fürs beispiel)
    xxx=time(NULL);
    
    //wandelt time_t in tm -> um auf die elemente zuzugreifen
    xxx_tm=localtime(&xxx);
    
    //hier auf die einzelnen elemente über ->
    //dann datum nach belieben zusammen bauen! -> z.B. UTC
    std::cout << xxx_tm->tm_mday << ":" << xxx_tm->tm_mon << ":" << xxx_tm->tm_year << std::endl;
    

    Red Skall schrieb:

    Das mit dem "per Hand" konvertieren (in beide Richtungen) klappt sehr gut, trotzdem gucke ich mir 'DateTime' nochmal an.

    Besten Dank!

    - hast also dein problem gelöst? vollständig?
    - ich lös das meistens so wie ich es oben gemacht hab... 🙄

    - falls noch fragen bestehen schreib ruhig... 😃



  • edit:
    mir ist gerade aufgefallen ich habe bei mein code-beispiel vergessen die differenzen der Zeitformat unterschiede zu berechnen...
    also wenn du sowas machst wie ich im beispiel solltest du noch + oder - für die unterschiede der zeitformate rechnen um durch diese differenz keine ungenauigkeiten zu bekommen!! (mit differenz meine ich das z.B. WindowsTimeFormat geht ab 1.1.1670 los... warum auch immer... bei time_t ein Unix-Timestamp 1.1.1970... und es gibt bestimmt noch andere 😃 😃 ...)

    sry falls ich i.wo etwas ungenau bin aber hab gerade wenig zeit...
    hoff ich hab alles weitestgehen erklärt (auch verständlich 🙂 )



  • Sag das doch gleich 😉

    Die Zeit in einen Pointer auf tm umwandeln gefällt mir bis jetzt am besten! Es klappt auch sehr gut. Allerdings benutze ich nicht 'mktime()' sondern 'gmtime()' wegen der lokalen zeit.

    den ungekehrten Weg gehe ich jetzt so:

    time_t TestToTimeT(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond)
    {
    	struct tm tDateTM;
    
    	memset(&tDateTM, 0, sizeof(struct tm));
    
    	tDateTM.tm_year	= (iYear - 1900);
    	tDateTM.tm_mon	= (iMonth - 1);
    	tDateTM.tm_mday	= iDay;
    	tDateTM.tm_hour	= iHour;
    	tDateTM.tm_min	= iMinute;
    	tDateTM.tm_sec	= iSecond;
    
    //	tDateTM.tm_isdst;
    
    	return (mktime(&tDateTM));
    }
    

    Das einzige Problem was sich ergibt ist die Zeitverschiebung. Ich habe mit 'tm_isdst' experimentiert, aber das mit der Zeitverschiebung bekomme ich nicht hin...

    Unter Windows CE habe ich dazu noch unaufgelöste Symbole für 'mktime()' und 'gmtime()'.



  • - ich benutze "localtime()" wie du siehst... um time_t in tm umzuwandeln...
    - vestehe jetzt nicht ganz... -> kannst doch wie am anfang des themas schon genannt mit diesen windows ce befehlen auch "mktime()" unter windows ausführen... also kombiniere alles dann müsste es laufen 😉 ...

    - was für eine zeitverschiebung? (zwischen den zeitstempeln?, die musst du eig einfach "weg rechnen", da sollten keine fehler auftreten...) oder meinst du richtige "zeitverschiebung"? 😕



  • Ich meine die echte Zeitverschiebung (Zeitzonen).

    'mktime()' berücksichtigt immer die lokale Zeitverschiebung. Desswegen ist das Ergebnis immer (je nach Zeitzone) um X Stunden versetzt. Desswegen habe ich 'gmtime()' benutzt.

    Aber 'gmtime()' verursacht die nicht aufgelösten Symbole (Nur unter WinCE).

    Desswegen:
    - Entweder kriege ich die in 'mktime()' enthaltene Zeitverschiebung raus
    oder
    - ich kriege 'gmtime()' ohne nicht aufgelöste Symbole unter WinCE hin.


Anmelden zum Antworten