2010-06-07 6 views
0

Il est un temps représenté en MJD et format BCD avec 5 octets .Je me demande quel est le format recommandé pour enregistrer cette date-heure dans la base de données sqlite afin que l'utilisateur peut chercher contre?format recommandé pour gagner du temps avec le format MJD + BCD dans la base de données

Ma première tentative est de l'enregistrer telle quelle, c'est-à-dire une chaîne de 5 octets. L'utilisateur utilisera le même format pour rechercher et le résultat sera converti en temps unix par l'utilisateur avec le code suivant.

Cependant, plus tard, il m'a été suggéré d'enregistrer l'heure dans l'entier - l'heure UTC, par exemple. Mais je ne peux pas trouver un moyen standard pour faire la conversion. Je pense que c'est un problème commun et que vous aimeriez entendre vos commentaires.

time_t sidate_to_unixtime(unsigned char sidate[]) 
{ 
int k = 0; 
struct tm tm; 
double mjd; 

/* check for the undefined value */ 
if ((sidate[0] == 0xff) && 
    (sidate[1] == 0xff) && 
    (sidate[2] == 0xff) && 
    (sidate[3] == 0xff) && 
    (sidate[4] == 0xff)) { 
    return -1; 
} 

memset(&tm, 0, sizeof(tm)); 
mjd = (sidate[0] << 8) | sidate[1]; 

tm.tm_year = (int) ((mjd - 15078.2)/365.25); 
tm.tm_mon = (int) (((mjd - 14956.1) - (int) (tm.tm_year * 365.25))/30.6001); 
tm.tm_mday = (int) mjd - 14956 - (int) (tm.tm_year * 365.25) - (int) (tm.tm_mon * 30.6001); 
if ((tm.tm_mon == 14) || (tm.tm_mon == 15)) k = 1; 
tm.tm_year += k; 
tm.tm_mon = tm.tm_mon - 2 - k * 12; 

    tm.tm_sec = bcd_to_integer(sidate[4]); 
tm.tm_min = bcd_to_integer(sidate[3]); 
tm.tm_hour = bcd_to_integer(sidate[2]); 

return mktime(&tm); 
} 

Répondre

0

Enregistrer comme UTC. C'est votre meilleur pari.

0

Utilisez le SQLite date and time functions.

Par exemple,

datetime(MJD + 2400000.5) 

test:

sqlite> select datetime(49987 + 2400000.5); 
1995-09-27 00:00:00 
Questions connexes