простой способ добавить 1 месяц к time_t в C/C++

подход правильный (диалог внутри onChange), но вам нужно внести некоторые изменения. Когда SAPUI5 вызывает метод onChange, значение уже записывается внутри вашего элемента управления, поэтому oEvent.stopPropagation(); вообще ничего не делает.

Что вы можете сделать, это использовать метод ComboBox setSelectedItem(null), который должен сбросить текущий выбор (отменяя выбор пользователя).

ОБНОВЛЕНИЕ: Я обновил код, чтобы удовлетворить ваш запрос.

    __selectedItem: null,

    onChange: function (oEvent) {
        var that = this;
        var source = oEvent.getSource();
        var selectedItem = oEvent.getSource().getSelectedItem();
        MessageBox.show("Are you sure you want to do that?", {
            icon: MessageBox.Icon.Information,
            title: "Info",
            actions: [MessageBox.Action.YES, MessageBox.Action.NO],
            defaultAction: MessageBox.Action.NO,
            onClose: function (sButton) {
                if (sButton === MessageBox.Action.YES) {
                    //execute my logic in here => that works
                    that.__selectedItem = selectedItem;
                } else {
                    source.setSelectedItem( that.__selectedItem );
                }
            }
        });
    }
6
задан Deduplicator 29 June 2015 в 15:40
поделиться

3 ответа

AddMonths_OracleStyle метода делает то, в чем Вы нуждаетесь.

Возможно, Вы хотели бы заменить IsLeapYear и GetDaysInMonth к некоторым методам библиотекаря.

#include <ctime>
#include <assert.h>

bool IsLeapYear(int year) 
{
    if (year % 4 != 0) return false;
    if (year % 400 == 0) return true;
    if (year % 100 == 0) return false;
    return true;
}

int daysInMonths[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int GetDaysInMonth(int year, int month)
{
    assert(month >= 0);
    assert(month < 12);

    int days = daysInMonths[month];

    if (month == 1 && IsLeapYear(year)) // February of a leap year
        days += 1;

    return days;
}

tm AddMonths_OracleStyle(const tm &d, int months)
{
    bool isLastDayInMonth = d.tm_mday == GetDaysInMonth(d.tm_year, d.tm_mon);

    int year = d.tm_year + months / 12;
    int month = d.tm_mon + months % 12;

    if (month > 11)
    {
        year += 1;
        month -= 12;
    }

    int day;

    if (isLastDayInMonth)
        day = GetDaysInMonth(year, month); // Last day of month maps to last day of result month
    else
        day = std::min(d.tm_mday, GetDaysInMonth(year, month));

    tm result = tm();

    result.tm_year = year;
    result.tm_mon = month;
    result.tm_mday = day;

    result.tm_hour = d.tm_hour;
    result.tm_min = d.tm_min;
    result.tm_sec = d.tm_sec;

    return result;
}

time_t AddMonths_OracleStyle(const time_t &date, int months)
{
    tm d = tm();

    localtime_s(&d, &date);

    tm result = AddMonths_OracleStyle(d, months);

    return mktime(&result);
}
3
ответ дан 8 December 2019 в 13:03
поделиться

Преобразовать time_t кому: struct tm, добавьте X к месяцу, добавьте месяцы> 12 к годам, преобразуйте назад. TM tm_mon является интервалом, добавляя 32000 +, месяцы не должны быть проблемой.

[редактирование] Вы могли бы найти, что соответствие Oracle хитро, после того как Вы добираетесь до более твердых случаев, как добавление 12 месяцев до 29.02.2008. И 03.01.2009 и 28.02.2008 разумны.

5
ответ дан 8 December 2019 в 13:03
поделиться

Можно использовать Повышение. GregorianDate для этого.

Строго говоря, определите месяц путем добавления корректного date_duration, и затем используйте end_of_month_day() из алгоритмов даты

6
ответ дан 8 December 2019 в 13:03
поделиться