рекомендуемый формат для экономии времени с форматом MJD + BCD в базе данных - PullRequest
0 голосов
/ 07 июня 2010

Существует время, представленное в формате MJD и BCD с 5 байтами. Мне интересно, каков рекомендуемый формат для сохранения этой даты-времени в базе данных sqlite, чтобы пользователь мог искать по ней?

Моя первая попытка - сохранить его как есть, то есть строку из 5 байтов. Пользователь будет использовать тот же формат для поиска, и результат будет преобразован пользователем во время Unix со следующим кодом.

Однако позже мне предложили сохранить время в целом числе - например, время UTC. Но я не могу найти стандартный способ сделать преобразование.

Я чувствую, что это общая проблема, и хотел бы услышать ваши комментарии.

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);
 }

Ответы [ 2 ]

0 голосов
/ 05 декабря 2010

Сохранить как UTC. Это ваша лучшая ставка.

0 голосов
/ 07 июня 2010

Используйте функции даты и времени SQLite .

Например,

datetime(MJD + 2400000.5)

тест:

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