Вопрос с отметкой времени

#c #timestamp

#c #временная метка

Вопрос:

Я получил строку временной метки в виде этого 3.44063E 08 . Как я могу преобразовать его в обычное время, например, 12: 10: 22 и т.д.

Комментарии:

1. Откуда у вас временная метка? Как вы получили временную метку? Или, другими словами, пожалуйста, покажите, что у вас уже есть.

2. Я получаю if из файла журнала системного приложения winxp

3. Откуда вы взяли временную метку? Что это за приложение? Что это за вызов функции?

Ответ №1:

Числовым значением является a time_t , вам нужно преобразовать его в местное или зеленое время, которое localtime() или gmtime() , соответственно, после чего вы можете использовать strftime() для печати в выбранном вами формате.

Вот краткий и полный пример:

 edd@max:/tmp$ cat timeformat.c 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    time_t tt = 3.44063E 08;
    struct tm tm;
    char buf[32];

    tm = *localtime(amp;tt);

    strftime(buf, 31, "%Y-%m-%d %H:%M:%S", amp;tm);
    printf("%sn", buf);
    return 0;
}
edd@max:/tmp$ gcc -o timeformat timeformat.c 
edd@max:/tmp$ ./timeformat 
1980-11-25 23:03:20
edd@max:/tmp$ 
  

Редактировать: И поскольку вы отметили свой вопрос C , взгляните на Boost Date_Time, который может многое предложить. Но, как показал мой пример, для простого преобразования «числа в текст» вам это не нужно.

Ответ №2:

Временная метка в экспоненциальном формате означает, что кто-то использовал счетчики времени с плавающей запятой и не обращал внимания, когда писал код для ее печати. Если у вас есть только этот фрагмент текста, вы не сможете преобразовать его в точное время, поскольку оно с точностью всего до 1000 секунд (около 20 минут). Если у вас действительно есть оригинал в виде double, вы можете получить из него точное время. Если у вас это значение с плавающей точкой, да поможет вам бог.

Это число (вероятно) является time_t, которое представляет собой количество секунд, прошедших с эпохи Unix (1 января 1970 года). Вы можете преобразовать его в структуру с разбивкой по времени (год, месяц и т.д.), Используя gmtime () или localtime (), А затем в любой текстовый формат, который вы хотите, используя strftime(). Если у вас есть только текст, а не фактическое число, вам придется сначала разобрать его до числа с помощью strtod().

Ответ №3:

Было бы полезно намного больше контекста, но предполагая, что он у вас уже есть, 3.44063E 08 равно 344063000, который в качестве time_t преобразуется в 1980-11-26 05:03:20 (utc). Если это имеет смысл для вас как временная метка, то это time_t: количество секунд с 1970-01-01.

Другая возможность заключается в том, что он был получен из Excel или другого продукта Microsoft Office, который хранит даты в виде дней с 1900 или 1899 в некоторых случаях. Это преобразуется в некоторую дату в 943,893 году. Если это имеет смысл, например, если вы выполняете астрономические или медленные вычисления радиоизотопов и т.д., Тогда это рано утром, примерно в 03: 42.