Как добавить минуты в C - PullRequest
       3

Как добавить минуты в C

0 голосов
/ 18 февраля 2019

У меня есть функция для добавления любых минут к дате в C, используя struct tm и maketime.функция принимает время даты в строке и минуты в целых числах, затем добавляет минуты к времени даты и затем возвращает строку.

char *addMinutes(char *dateTime, int mins)
{
    /* Intput & Output: YYYYMMDDHHMM */
    char year[5];
    char month[3];
    char day[3];
    char HH[3];
    char MM[3];
    char newDateTime[13];
    struct tm t;

    STRMCPY(year,   dateTime,    4);
    STRMCPY(month, &dateTime[4], 2);
    STRMCPY(day,   &dateTime[6], 2);
    STRMCPY(HH,    &dateTime[8], 2);
    STRMCPY(MM,    &dateTime[10],2);

    printf("input %s %s %s %s %s\n",year,month,day,HH,MM);
    t.tm_year = atoi(year);
    t.tm_mon = atoi(month)-1;
    t.tm_mday = atoi(day);
    t.tm_hour = atoi(HH);
    t.tm_min = atoi(MM)+mins;

    printf("input %d %d %d %d %d\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min);

    mktime(&t);
    printf("input %d %d %d %d %d\n",t.tm_year,t.tm_mon,t.tm_mday,t.tm_hour,t.tm_min);

    sprintf(newDateTime, "%04d%02d%02d%02d%02d", t.tm_year, t.tm_mon,
                            t.tm_mday,t.tm_hour,t.tm_min);

    return newDateTime;
}

Ниже приведен мой результат, если я вызову вышеуказанную функцию strcpy (atb30, addMinutes ("201812120431 ", 30));

input 2018 12 12 04 31
input 2018 11 12 4 61
input 2018 11 12 5 41
atb 201811120541

Я не понимаю, почему моя программа не работает.И как правильно написать функцию addMinutes, используя C.

Ответы [ 4 ]

0 голосов
/ 18 февраля 2019

После прочтения всех ответов я обновил свой код до следующего.

void addMinutes(char *dateTime, int mins,char *newDateTime)
{
    /* Intput & Output: YYYYMMDDHHMM */
char year[5];
char month[3];
char day[3];
char HH[3];
char MM[3];
struct tm *info;

STRMCPY(year,   dateTime,    4);
STRMCPY(month, &dateTime[4], 2);
STRMCPY(day,   &dateTime[6], 2);
STRMCPY(HH,    &dateTime[8], 2);
STRMCPY(MM,    &dateTime[10],2);

struct tm t = { 0 };
t.tm_isdst = -1;
t.tm_year = atoi(year)-1900;
t.tm_mon = atoi(month)-1;
t.tm_mday = atoi(day);
t.tm_hour = atoi(HH);
t.tm_min = atoi(MM)+mins;
t.tm_sec = 0;

if (mktime(&t) == -1) {
    printf("Failed conversion\n");
    exit(-1);
}
    time_t equivalent = mktime(&t);
    strftime(newDateTime,80,"%Y%m%d%H%M", localtime(&equivalent));  
}
0 голосов
/ 18 февраля 2019

Не изобретайте велосипед и не принимайте строку, которую вы должны проанализировать.Вместо этого возьмите указатель на struct tm.Таким образом, «кто-то еще» должен позаботиться о обработке строковых входов.

struct tm *addMinutes(const struct tm *time, int nMin)
{
    time_t equivalent = mktime(time);
    equivalent += (nMin*60);

    return localtime(&equivalent);
}
0 голосов
/ 18 февраля 2019

Многие проблемы

Неправильная эпоха

Член .tm_year относится к 1900 году. @ paddy

// t.tm_year = atoi(year);
t.tm_year = atoi(year) - 1900;

Проверка на успех

// mktime(&t);
if (mktime(&t) == -1) {
  puts("Failed conversion");
  exit(EXIT_FAILURE);
}

Неполное назначение

Приведенный ниже код не назначает других членов t, что приводит к сомнительнымрезультат.Вместо этого полностью присвойте t и используйте -1 для .tm_isdst, если вы не знаете настройки для даты.

// struct tm t;
struct tm t = { 0 };

t.tm_isdst = -1; // add
t.tm_year = atoi(year)  - 1900;
t.tm_mon = atoi(month) - 1;
t.tm_mday = atoi(day);
t.tm_hour = atoi(HH);
t.tm_min = atoi(MM) + mins;
if (mktime(&t) == -1) {
  puts("Failed conversion");
  exit(EXIT_FAILURE);
}

Возврат неверного указателя

return newDateTime; пытается вернуть указатель на локальный массив.Это неопределенное поведение .Код нуждается в новом подходе.Рекомендуем перейти к функции выделения для сохранения нового newDateTime.

Скупой размер буфера

char newDateTime[13]; достаточно пограничный.Что произойдет, если год превысит 4 символа?

// char newDateTime[13];
// sprintf(newDateTime, "%04d%02d%02d%02d%02d", 
//     t.tm_year, t.tm_mon, t.tm_mday,t.tm_hour,t.tm_min);
char newDateTime[13 * 2];
snprintf(newDateTime, sizeof newDateTime, "%04d%02d%02d%02d%02d", 
     t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min);

Также исследуйте strftime().

0 голосов
/ 18 февраля 2019

Согласно tp, параметр tm_min принимает только целые числа от 0 до 59. Подумайте о том, чтобы обработать ввод с некоторыми операторами if / while, чтобы обеспечить правильное сохранение часов и минут перед вызовом mktime(&t);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...