Zeit in Lokalzeit umwandeln **gelöst**



  • Hi Leute,

    mal eine Frage

    ich habe folgende Anweisungen hinter einen Button gesetzt:

    time_t Time;
    tm pTime;
    
    Time = time(0);
    pTime = localtime(&Time);
    

    wenn ich das Programm starte und den Button drücke klappt alles wunderbar. Wenn ich nun während das Programm läuft die Systemzeit von Windows verändere (z.B.: andere Zeitzone) und den Button erneut klicke hat der noch die alte Zeit.

    Woran liegt das?

    Unter Borland geht das auch ohne Programmneustart.

    MfG



  • Du hast zwar nicht geschrieben unter welchem Compiler Du das problem hast.

    Wie wäre es mit der Win-API Funktion GetLocalTime() ?
    (ggf. alternativ GetSystemTime() je nach Problemstellung)

    Diese Funktionen sind Compiler-unabhängig, und berücksichtigt alle Zeitzonen und Sommerzeit-Einstellungen von Windows!

    Just my 2 cents
    Martin



  • ich benutze VS 2008 und es ist eine MFC anwendung



  • Time-Zone Infos gibt es hier:
    http://support.microsoft.com/kb/932955/en-us

    AFAIK aktualisiert sich die CRT aber nicht, wenn Du in den Systemeinstellungen was änderst...
    Siehe auch "_tzset_nolock" bzw. "__tzset"; das wird nur *einmal* gemacht...

    Du kannst es aber IMHO forcen, indem Du "_tzset" aufrufst...
    Dazu musst Du Dich auf die Broardcast Nachricht WM_TIMECHANGE registrieren und dann _tzset aufrufen...



  • Jochen Kalmbach schrieb:

    AFAIK aktualisiert sich die CRT aber nicht, wenn Du in den Systemeinstellungen was änderst...
    Siehe auch "_tzset_nolock" bzw. "__tzset"; das wird nur *einmal* gemacht...

    Du kannst es aber IMHO forcen, indem Du "_tzset" aufrufst...
    Dazu musst Du Dich auf die Broardcast Nachricht WM_TIMECHANGE registrieren und dann _tzset aufrufen...

    Ach Du liebe Güte, dann kann ich heute echt froh sein daß ich in meinen Windows-Applikationen gleich GetLocalTime() verwendet habe (und nicht die CRT-Funktionen).
    Mit dieser Funktion sind alle Eventualitäten (Sommer-/Winterzeitwechsel, Benutzer ändert Zeitzone, usw. ) berücksichtigt.

    Martin



  • danke schon mal GetLocaltime funktioniert super.

    Jetzt bleibt nur noch das Problem wie Convertiere ich eine UTC Zeit (sekunden seit 1970), die mir ein Gerät gibt in die Korrekte Zeit?

    Also gibt es eine WINAPI funktion die das entgegengesetzte von RtlTimeToSecondsSince1970 macht?

    MfG



  • Du musst einfach nur das umgekehrte aus der Doku machen:
    1. Call SystemTimeToFileTime to copy the system time to a FILETIME structure. Call GetSystemTime to get the current system time to pass to SystemTimeToFileTime.
    2. Copy the contents of the FILETIME structure to a ULARGE_INTEGER structure.
    3. Initialize a SYSTEMTIME structure with the date and time of the first second of January 1, 1970.
    4. Call SystemTimeToFileTime, passing the SYSTEMTIME structure initialized in Step 3 to the call.
    5. Copy the contents of the FILETIME structure returned by SystemTimeToFileTime in Step 4 to a second ULARGE_INTEGER. The copied value should be greater than or equal to the value copied in Step 2.
    6. Subtract the 64-bit value in the ULARGE_INTEGER structure initialized in Step 2 from the 64-bit value of the ULARGE_INTEGER structure initialized in Step 5. This produces a value in 100-nanosecond intervals since January 1, 1970. To convert this value to seconds, divide by 10,000,000.



  • danke für den Tipp mit der FILETIME und damit man rechnen kann.


Anmelden zum Antworten