Преобразование функции даты и времени C # в Javascript - PullRequest
0 голосов
/ 12 мая 2019

У меня есть приложение, в котором я использую пару функций манипуляции с датой и временем, чтобы заполнить пару календарей.По сути, пользователь выбирает месяц / год из выпадающего списка (скажем, март 2019 г.), и я заполняю календари 03/01/2019 и 03/31/2019.

Я хотел сделать это на стороне клиента, такЯ пытался конвертировать эти функции в javascript, и я получаю странные результаты и не вижу, что я делаю неправильно.

Это оригинальные функции C #, которые я определил и использовал:

public static DateTime FirstDayOfMonth(this DateTime dt)
{
    return new DateTime(dt.Year, dt.Month, 1);
}

public static DateTime LastDayOfMonth(this DateTime dt)
{
    DateTime dtFirstDayOfMonth = new DateTime(dt.Year, dt.Month, 1);
    DateTime dtLastDayOfMonth = dtFirstDayOfMonth.AddMonths(1).AddDays(-1);
    return dtLastDayOfMonth;
}

Я назвал их, как показано ниже:

DateTime dtSelected = DateTime.Today.AddMonths(int.Parse(ddlMonth.SelectedValue)).AddYears(-1);
dtStartDate = Utils.FirstDayOfMonth(dtSelected);
dtEndDate = Utils.LastDayOfMonth(dtSelected);

Раскрывающийся список заполняется следующим образом:

for (int i = 12; i >= 1; i--)
{
    string s = DateTime.Now.AddYears(-1).AddMonths(i).ToString("Y");
    ListItem li = new ListItem(s, i.ToString());
    ddlMonth.Items.Add(li);
}

Раскрывающиеся записи будут выглядеть так:

May, 2019    -- value of 12
April, 2019  -- value of 11
....
July, 2018   -- value of 2
June, 2018   -- value of 1

Это мойпопытка перевести на javacript:

function firstDayOfMonth(dt) {debugger
    var year = dt.getFullYear();
    var month = dt.getMonth();
    var day = dt.getDate();
    return new Date(year, month, 1);
}

function lastDayOfMonth(dt) {debugger
    var year = dt.getFullYear();
    var month = dt.getMonth();
    var day = dt.getDate();
    var firstDayOfMonth = new Date(year, month, 1);
    var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1); --> shows error when called; Object doesn't support property or method 'AddMonths'

    return lastDayOfMonth;
}

$(document).on('change', '#ddlMonth', function () {debugger
    var monthID = this.value;
    var ddlMonth = $('#ddlMonth');
    var today = new Date();
    var startDate = new Date();
    var endDate = new Date();
    var dtSelected = new Date();

    if (ddlMonth.val() == "")
    {
        ....
    }
    else
    {debugger
        dtSelected.setMonth(dtSelected.getMonth() + ddlMonth.val() + 1); -- this becomes "Wed Oct 12, 2360" if I select "March, 2019" from dropdown!
        dtSelected.setFullYear(dtSelected.getFullYear() - 1);
        dtStartDate = firstDayOfMonth(dtSelected);
        dtEndDate = lastDayOfMonth(dtSelected);
    }

1 Ответ

0 голосов
/ 13 мая 2019

у вас есть проблема в вашем коде, например:

dtSelected.setMonth(dtSelected.getMonth() + ddlMonth.val() + 1); -- this becomes August of 2036!

Вы берете сегодняшний месяц, который равен 5, а затем добавляете к его стоимости из своего выбора и добавляете еще 1, и это много месяцев, чтобы добавить.

Я думаю, вам нужно изменить некоторые вещи и сделать это так: измените выбранные значения на дату первого дня каждого месяца, а не просто число:

for (int i = 12; i >= 1; i--)
{
    DateTime date = DateTime.Now.AddYears(-1).AddMonths(i);
    ListItem li = new ListItem(date.ToString("Y"), date.ToString("yyyy-MM-01"));
    ddlMonth.Items.Add(li);
}

в этом формате вы можете использовать его на JS без проблем.

теперь для вашей функции js:

function lastDayOfMonth(dt) {debugger
    var year = dt.getFullYear();
    var month = dt.getMonth();
    var day = dt.getDate();
    var lastDayOfMonth = new Date(year, month, 1);
    lastDayOfMonth.setMonth(lastDayOfMonth.getMonth() + 1);
    lastDayOfMonth.setDate(lastDayOfMonth.getDate() - 1);

    return lastDayOfMonth;
}

$(document).on('change', '#ddlMonth', function () {debugger
    var ddlMonth = $('#ddlMonth');
    dtStartDate = new Date(ddlMonth.val());
    dtEndDate = lastDayOfMonth(dtStartDate);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...