【问题标题】:How do I represent date range for months that donot have 31 days in c#?如何在 c# 中表示没有 31 天的月份的日期范围?
【发布时间】:2013-01-26 00:28:48
【问题描述】:

我想查找某个员工一个月内请的假。 该代码适用于所有日期。 现在,如果我想找到员工在一月份的休假,范围是:

DateTime first = Convert.ToDateTime(DateTime.Now.Month + "01" + DateTime.Now.Year);
DateTime end = Convert.ToDateTime(DateTime.Now.Month + "31" + DateTime.Now.Year);

问题是有些月份没有 31 天。有没有一种简单的方法可以分配变量 From 和 To 范围。当月份为 2 月或 4 月时会出现错误,因为它们没有 31 天。

执行搜索的代码是:

returnedRows = LeaveDS.Tables["Leave"].Select("LeaveDate >= #" + first + "# AND LeaveDate <= #" + end + "#");

【问题讨论】:

    标签: c# datetime datarow


    【解决方案1】:

    你可以这样做:

    DateTime end = first.AddMonths(1).AddDays(-1);
    

    【讨论】:

      【解决方案2】:
      DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)
      

      它会给你一个月的日子。

      【讨论】:

        【解决方案3】:

        使用DateTime.DaysInMonth(int year, int month)

                int days = DateTime.DaysInMonth(2012, 2);
                int days2 = DateTime.DaysInMonth(2011, 2);
        

        输出:

         days = 29
         days2 = 28
        

        【讨论】:

          【解决方案4】:

          您可以通过DateTime.DaysInMonth(year,month) 获取一个月的天数,并将其作为查询的依据。

          替代方法是使用每个月的第一天,但​​将您的选择查询更改为小于结束日期。

          DateTime first = Convert.ToDateTime(DateTime.Now.Month + "01" + DateTime.Now.Year);
          DateTime end = first.AddMonths(1); // Becomes 01 of next month
          
          returnedRows = LeaveDS.Tables["Leave"].Select("LeaveDate >= #" + first + "# AND LeaveDate < #" + end + "#");
          

          【讨论】:

            【解决方案5】:

            有一个很好的方法来获取一个月的天数,它叫做DateTime.DaysInMonth

            DateTime end = new DateTime(first.Year, first.Month, DateTime.DaysInMonth(first.Year, first.Month);
            

            【讨论】:

              【解决方案6】:
              var enddate = DateTime.Now.AddMonths(1);
              DateTime end = new DateTime(enddate.Year,enddate.Month,1);
              

              【讨论】:

                【解决方案7】:

                顺便说一句,如果您使用 .NET 3.5 或更高版本,Linq-To-DataSet 将简化和改进代码:

                int month = 2; // f.e. for february
                var currentCalendar = System.Globalization.CultureInfo.CurrentCulture.Calendar;
                int daysInMonth = currentCalendar.GetDaysInMonth(month);
                DateTime start = new DateTime(DateTime.Now.Year, month, 1);
                DateTime end = new DateTime(DateTime.Now.Year, month, daysInMonth);
                var filteredRows = LeaveDS.Tables["Leave"].AsEnumerable()
                    .Where(r => r.Field<DateTime>("LeaveDate").Date >= start
                             && r.Field<DateTime>("LeaveDate").Date <= end );
                // use ToArray for an array, CopyToDataTable for a DataTable etc.
                

                【讨论】:

                • 这段代码看起来很有趣,但我不太擅长 LINQ,所以我不会使用它。还是谢谢
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多