18

Вопрос по unix, c – Как конвертировать дату и время в Unix в c?

Сценарий таков: я получаю дату и время в формате "ГГГГ-ММ-ДД ЧЧ: ММ: СС". с libexif. Чтобы свести к минимуму экономию средств, я хочу преобразовать дату и время в метку времени Unix или аналогичную, которая стоит всего 64 или 32 бита. Есть ли явный способ с с?

  • Error: User Rate Limit ExceededConditional jump or move depends on uninitialised value(s)Error: User Rate Limit Exceededstackoverflow.com/questions/9037631/…Error: User Rate Limit ExceededtmError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededtimegm()Error: User Rate Limit Exceededmktime()Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • mktime()Error: User Rate Limit Exceededtimegm()Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededstackoverflow.com/questions/321849/…

    от
  • Error: User Rate Limit Exceeded

    от
6 ответов
  • 1

    Что насчет sscanf?

    struct tm tmVar;
    char *strVar = "YYYY-MM-DD HH:MM:SS";
    time_t timeVar;
    if(sscanf(strVar, "%d-%d-%d %d:%d:%d", &tm.tm_year, /* the other fields */)==6)
        timeVar = mktime(&tmVar);
    else
        // bad format
    

  • 31

    Вы можете попробовать комбинацию

    strptime а такжеуказываете ей

    struct tm tm;
    time_t epoch;
    if ( strptime(timestamp, "%Y-%m-%d %H:%M:%S", &tm) != NULL )
      epoch = mktime(&tm);
    else
      // badness
    

  • 1

    Вот проводное решение в c / псевдокоде

    который я только что взломал. Удачи!

    char * runner = NULL;
    char *string_orig = "YYYY-MM-DD HH:MM:SS";
    time_t time = 0;
    struct tm tmp;
    
    use strstr(string_orig, "-") and atoi foreach
    
      tmp->tm_year .. 
      tmp->tm_mon  .. 
      tmp->tm_mday ..  
      tmp->tm_hour  .. 
      tmp->tm_min  .. 
      tmp->tm_sec .. 
    
    with *runner as help
    
    time = mktime(&tm)
    

  • 5

    Преобразуйте каждую часть даты / времени в целое число

    чтобы заполнитьstruct tm, а затем преобразовать это вtime_t с помощьюуказываете ей.

  • 0

    Linux поддерживает

    getdate() функция, которую я считаю более практичной, чем вызовstrptime() непосредственно. Это потому чтоgetdate() функция автоматически проверяетmany форматы для вас. Это эквивалентно звонкуstrptime()Error: User Rate Limit Exceeded

    // setenv() should be called only once
    setenv("DATEMSK", "/usr/share/myprog/datemsk.fmt", 0);
    
    // convert a date
    struct tm * t1(getdate("2018-03-31 14:35:46"));
    if(t1 == nullptr) ...handle error...
    time_t date1(timegm(t1));
    
    // convert another date
    struct tm * t2(getdate("03/31/2018 14:35:46"));
    if(t2 == nullptr) ...handle error...
    time_t date2(timegm(t2));
    

    Замечания:timegm() похож наmktime()Error: User Rate Limit Exceeded

    Файл datemsk.fmt будет содержать как минимум следующие два формата для поддержки вышеуказанных дат:

    %Y-%b-%d %H:%M:%S
    %b/%d/%Y %H:%M:%S
    

    Error: User Rate Limit Exceededstrptime() в петле.

    Linux также предлагаетgetdate_r() функция, которая является потокобезопасной.

    Man Page:http://pubs.opengroup.org/onlinepubs/7908799/xsh/getdate.html

  • 0

    Вот готовый фрагмент, когда strptime недоступен:

    #include <stddef.h>
    #include <time.h> 
    #include <stdio.h> 
    
    time_t string_to_seconds(const char *timestamp_str)
    {
        struct tm tm;
        time_t seconds;
        int r;
    
        if (timestamp_str == NULL) {
            printf("null argument\n");
            return (time_t)-1;
        }
        r = sscanf(timestamp_str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
        if (r != 6) {
            printf("expected %d numbers scanned in %s\n", r, timestamp_str);
            return (time_t)-1;
        }
    
        tm.tm_year -= 1900;
        tm.tm_mon -= 1;
        tm.tm_isdst = 0;
        seconds = mktime(&tm);
        if (seconds == (time_t)-1) {
            printf("reading time from %s failed\n", timestamp_str);
        }
    
        return seconds;
    }
    

    Error: User Rate Limit Exceededtimezone (или же_timezone) отseconds (timezone глобальный определяется в time.h. DST уже игнорируется при обнуленииtm_isdst полеtm.