Добавить месяц к дате

Статус
В этой теме нельзя размещать новые ответы.

TheZipa

Участник
Сообщения
45
Реакции
7
Привет.

Ищу решение, которое позволит добавить месяц или несколько месяцев к дате.
Например, мы имеем:

Пример:
FormatTime(szBuffer, sizeof(szBuffer), "%d.%m.%y"); // Получили дату

Получив сегодняшнюю дату, я хочу добавить к ней месяц или несколько месяцев.
 

xtance

Участник
Сообщения
513
Реакции
743
Так как в разных месяцах разное кол-во дней, можно случайно перескочить февраль, прибавляя 31 день
Можно получить дату начала следующего месяца функцией GetNextMonthStart, передав ей текущую дату и кол-во прибавляемых месяцев:

PrintToServer("Результат: %i", GetNextMonthStart(GetTime(), 2));
// выведет: 1617224400 (т.е., Thu Apr 01 2021 00:00:00)

При большом желании можно добавить недостающие дни (как-нибудь посчитать ручками)

Реализация функции:
// Параметры: дата от которой считать, кол-во месяцев
// Вернёт первую секунду итогового месяца или последнюю если считали в прошлое
int GetNextMonthStart(int unixtime, int months){

    int add = (months < 0) ? -1 : 1; // позволяет считать в прошлое
    int changed = 0; // счётчик изменившихся месяцев
    int now = unixtime;
   
    char before[16], after[16];
    FormatTime(before, sizeof(before), "%m", now);
   
    while (changed != months){
        now += add;
        FormatTime(after, sizeof(after), "%m", now);
        // если месяц изменился, увеличить счётчик
        if (!StrEqual(before, after, true)) {
            before = after;
            changed += add;
        }
    }
   
    return now;
}


Работает не очень быстро
Не используйте в OnGameFrame, OnPlayerRunCmd и т.д.
 

TheZipa

Участник
Сообщения
45
Реакции
7
Так как в разных месяцах разное кол-во дней, можно случайно перескочить февраль, прибавляя 31 день
Можно получить дату начала следующего месяца функцией GetNextMonthStart, передав ей текущую дату и кол-во прибавляемых месяцев:

PrintToServer("Результат: %i", GetNextMonthStart(GetTime(), 2));
// выведет: 1617224400 (т.е., Thu Apr 01 2021 00:00:00)

При большом желании можно добавить недостающие дни (как-нибудь посчитать ручками)

Реализация функции:
// Параметры: дата от которой считать, кол-во месяцев
// Вернёт первую секунду итогового месяца или последнюю если считали в прошлое
int GetNextMonthStart(int unixtime, int months){

    int add = (months < 0) ? -1 : 1; // позволяет считать в прошлое
    int changed = 0; // счётчик изменившихся месяцев
    int now = unixtime;
  
    char before[16], after[16];
    FormatTime(before, sizeof(before), "%m", now);
  
    while (changed != months){
        now += add;
        FormatTime(after, sizeof(after), "%m", now);
        // если месяц изменился, увеличить счётчик
        if (!StrEqual(before, after, true)) {
            before = after;
            changed += add;
        }
    }
  
    return now;
}


Работает не очень быстро
Не используйте в OnGameFrame, OnPlayerRunCmd и т.д.
Я решил прибавлять не 31, а 30 дней. И если февраль пролетит мимо, то это не будет критично и даже не повлияет на логику. Да и использовать 1 строчку гораздо проще.
Но этот вариант вроде бы тоже рабочий, так что может быть полезен кому-либо, так что однозначно спасибо.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу