2010-06-16 22 views
5

Escribo un envoltorio simple alrededor de la estructura Win32 FILETIME. boost::datetime tiene la mayor parte de lo que quiero, excepto que necesito cualquier tipo de fecha que termine usando para interpolar con las API de Windows sin problemas.¿Cómo se puede implementar FileTimeToSystemTime?

Para ese fin, he decidido escribir mis propias cosas para hacer esto: la mayoría de las operaciones no son tan complicadas. Estoy implementando el tipo TimeSpan en este momento, pero no estoy seguro de cómo implementar FileTimeToSystemTime. Podría usar la función FileTimeToSystemTime incorporada en el sistema, excepto que FileTimeToSystemTime no puede manejar fechas negativas. Necesito poder representar algo así como "-12 segundos".

¿Cómo se debe implementar algo como esto?

Billy3

+1

La estructura SystemTime tiene todos los componentes sin firmar, entonces, ¿cómo representarías los tiempos negativos? De hecho, The FileTime también es un tipo sin firmar, así que, ¿cómo obtendrías timespans negativos en primer lugar? – Gabe

+0

@Gabe: Buen punto - Realmente no estoy usando estas estructuras (estoy usando mucho), pero las utilicé en la pregunta para que la gente entendiera el significado semántico de lo que estaba hablando. –

Respuesta

2

Windows Los tipos de datos SYSTEMTIME y FILETIME están destinados a representar una fecha y hora particular. No son realmente adecuados para representar diferencias de tiempo. Las diferencias de tiempo son mejores como un número entero simple que representa el número de entre dos SYSTEMTIMEs o FILETIMEs. pueden ser segundos, o algo más pequeño si necesita más precisión.

Si necesita mostrar una diferencia a los usuarios, se pueden usar divisiones y módulos simples para calcular los componentes.

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

Asumiendo que no tienen un problema con la estructura que tienen todos los componentes no firmados, se podrían tomar cualquier lapsos negativos, hacerlas positivas, llame FileTimeToSystemTime, y luego (si la entrada original negativa) recoger a cabo los componentes para hacer negativo.

0

Veo mal diseño aquí. El lapso de tiempo, la diferencia entre dos veces, es el mismo cuando se mide con la hora del sistema y también con la hora del archivo. W32 FileTimeToSystemTime tiene razón al no aceptar valores negativos porque no tiene sentido. El período de 2 segundos es un período de 2 segundos, sin importar la zona horaria que utilizó.

// EDIT: Segundo problema. SYSTEMTIME de alguna manera puede representar el lapso de tiempo, pero sería erróneo. Es decir. mes no es una unidad utilizable cuando se mide el tiempo.

+0

¿Por qué el mes no es una unidad utilizable? 2010-06-01 - 2010-02-01 = 4 meses. –

+1

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

+0

2010-01-30 + 1 mes = 1 de marzo –

Cuestiones relacionadas