代码之家  ›  专栏  ›  技术社区  ›  NoBullMan

将C#date time函数转换为Javascript

  •  0
  • NoBullMan  · 技术社区  · 7 年前

    我有一个应用程序,其中我使用了一些日期/时间操作函数来填充一些日历。基本上,用户从下拉列表中选择一个月/年(比如2019年3月),我用03/01/2019和03/31/2019填充日历。

    我想做这个客户端,所以试图将这些函数转换成javascript,我得到了奇怪的结果,看不出我做错了什么。

    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
    

    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);
        }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Yair I    7 年前

    您的代码中有一些问题,例如:

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

    你取今天的月份,也就是5,然后从你的slect中加上它的一些值,再加上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上毫无问题地使用它。

    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);
     }