//--------------------------------------------------------------------------- #include #pragma hdrstop #include //--------------------------------------------------------------------------- #pragma argsused //--------------------------------------------------------------------------- #define _XOPEN_SOURCE /* glibc2 needs this */ #include #include // точное время struct prec_tm { struct tm tm; // стандартный timestamp unsigned char ss; // сантисекунды }; // точное время -> кол-во сантисекунд (!!) int time2ss(struct prec_tm * ptm, __int64 * ss) { time_t time = mktime(&ptm->tm); if (time == (time_t)-1) { fprintf(stderr, "mktime(3) fails with error: can't convert date to time!\n"); return 1; } *ss = ((__int64)time) * 100 + ptm->ss; return 0; } // кол-во сантисекунд -> точное время (!!) int ss2time(const __int64 * ss, struct prec_tm * ptm) { time_t time = (*ss)/100; struct tm * ret = localtime(&time); if (ret == NULL) { fprintf(stderr, "localtime_r(3) fails with error: can't convert time to date!\n"); return 1; } ptm->tm = *ret; ptm->ss = (*ss)%100; return 0; } // строка -> точное время int str2time(const char * date, struct prec_tm * ptm) { char *ret = strptime(date, "%d.%m.%Y %T", &ptm->tm); // я не понял стандарта, видимо ответственность за корректность входных данных ложится на того, кто кладёт... // if (ret == NULL) { // fprintf(stderr, "strptime(3) error: can't parse date!\n"); // return 1; // } // ptm->tm.tm_year -= 1900; int len = strlen(date); // медленная операция, у принципе... ptm->ss = atoi(date + len - 2); return 0; } // точное время -> строка int time2str(struct prec_tm * ptm, char * buf) { sprintf(buf, "%.2u.%.2u.%.4u %.2u:%.2u:%.2u.%.2u", ptm->tm.tm_mday, ptm->tm.tm_mon + 1, ptm->tm.tm_year + 1900, ptm->tm.tm_hour, ptm->tm.tm_min, ptm->tm.tm_sec, ptm->ss); return 0; } int main(void) { const char date[] = "23.12.2008 10:50:59.36"; char buf[1024]; struct prec_tm ptm; str2time(date, &ptm); __int64 ss; time2ss(&ptm, &ss); ss2time(&ss, &ptm); time2str(&ptm, buf); printf("%s\n", buf); system("pause"); return 0; }