2010-06-16 9 views
5

Ich schreibe einen einfachen Wrapper um die Win32 FILETIME-Struktur. boost::datetime hat das meiste von dem, was ich will, außer dass ich jeden Datentyp brauche, den ich benutze, um mit Windows-APIs ohne Probleme zu interpolieren.Wie könnte man FileTimeToSystemTime implementieren?

Zu diesem Zweck habe ich beschlossen, meine eigenen Sachen dafür zu schreiben - die meisten Operationen sind nicht so kompliziert. Ich implementiere den TimeSpan-ähnlichen Typ an dieser Stelle, aber ich bin mir nicht sicher, wie ich FileTimeToSystemTime implementieren würde. Ich könnte einfach die eingebaute FileTimeToSystemTime-Funktion des Systems verwenden, außer dass FileTimeToSystemTime negative Daten nicht verarbeiten kann - ich muss etwas wie "-12 Sekunden" darstellen können.

Wie sollte so etwas implementiert werden?

billy3

+1

Die SystemTime-Struktur enthält alle Komponenten ohne Vorzeichen. Wie würden Sie also negative Zeitspannen darstellen? In der Tat, The FileTime ist auch ein unsigned Typ, also wie würden Sie negative Zeitspannen überhaupt erhalten? – Gabe

+0

@Gabe: Guter Punkt - ich benutze diese Strukturen nicht wirklich (ich benutze lange), aber ich habe sie in der Frage verwendet, damit die Leute die semantische Bedeutung dessen verstehen, worüber ich rede. –

Antwort

2

Windows SYSTEMTIME- und FILETIME-Datentypen sollen ein bestimmtes Datum und eine bestimmte Uhrzeit darstellen. Sie sind nicht wirklich geeignet, Zeitunterschiede darzustellen. Zeitdifferenzen sind besser als einfache ganze Zahl, die die Anzahl zwischen zwei SYSTEMTIMEs oder FILETIMEs darstellt. vielleicht Sekunden, oder etwas kleiner, wenn Sie mehr Präzision benötigen.

Wenn Sie den Benutzern einen Unterschied anzeigen müssen, können die Komponenten durch einfache Division und Modulus berechnet werden.

std::string PrintTimeDiff(int nSecDiff) 
{ 
    std::ostringstream os; 

    if (nSecDiff<0) 
    { 
     os << "-"; 
     nSecDiff= -nSecDiff; 
    } 
    int nSeconds = nSecDiff % (24*60*60); 
    nSecDiff /= 60; 
    int nMinutes = nSecDiff % (24*60) 
    nSecDiff /= 60; 
    int nHours = nSecDiff % 24; 
    int nDays = nSecDiff/24; 

    os << nDays << " Days " << nHours << ":" << nMinutes << ":" << nSeconds; 
    return os .str(); 
} 
1

Sie Angenommen, hat kein Problem mit der Struktur haben alle mit unsigned Komponenten, Sie alle negativen Zeitspannen nehmen könnten, sie positiv machen, rufen Sie FileTimeToSystemTime, und dann (wenn der ursprüngliche Eingang negativ war) wählen aus Komponenten um negativ zu machen.

0

Ich sehe schlechtes Design hier. Die Zeitspanne, die Differenz zwischen zwei Zeiten, ist gleich, wenn mit der Systemzeit und mit der Dateizeit gemessen wird. W32 FileTimeToSystemTime hat recht, negative Werte nicht zu akzeptieren, weil es keinen Sinn hat. Die Dauer von 2 Sekunden ist ein Zeitraum von 2 Sekunden, unabhängig davon, welche Zeitzone Sie verwendet haben.

// BEARBEITEN: Zweites Problem. SYSTEMTIME kann irgendwie eine Zeitspanne darstellen, aber es wäre falsch. I.e. Monat ist keine verwendbare Einheit, wenn Zeitspannen gemessen werden.

+0

Warum ist der Monat keine brauchbare Einheit? 2010-06-01 - 2010-02-01 = 4 Monate. –

+1

2010-01-30 + 1 Monat =? – adf88

+0

2010-01-30 + 1 Monat = 1. März –

Verwandte Themen