找到第三个星期日每个月给两个日期之间

问题描述:

发生

查找第三个星期日的每个月出现以下两个日期给出之间。找到第三个星期日每个月给两个日期之间

开始日期: - 07-06-2011 // DD-MM-YYYY

结束日期: - 07-06-2012 // DD-MM-YYYY

USEC#.NET

+7

那你有没有尝试什么? – skajfes 2011-06-07 10:38:46

+3

我们不介意在这里帮助人们完成作业,Pritesh,但我们不会在没有你付出一些努力的情况下给你答案。 – DOK 2011-06-07 10:40:56

这应该做的伎俩:

public List<DateTime> ThirdSundayOfEachMonth(DateTime startdate, DateTime enddate) 
{ 
    List<DateTime> result = new List<DateTime>(); 
    int sundaymonthcount = 0; 
    for(DateTime traverser = new DateTime(startdate.Year, startdate.Month, 1); traverser <= enddate; traverser = traverser.AddDays(1)){ 
    if(traverser.DayOfWeek == DayOfWeek.Sunday) sundaymonthcount++; 
    if(sundaymonthcount == 3 && traverser > startdate){ 
     result.Add(traverser); 
     sundaymonthcount = 0; 
     traverser = new DateTime(traverser.Year, traverser.Month, 1).AddMonths(1); 
    } 
    } 
return result; 
} 
+0

啊......没有看到那里的作业标签。那么应该让他先徘徊多一点。 – 2011-06-07 10:48:45

+0

没有太多使用循环这么简单的任务?这可以在几个数学运算中轻松完成 – 2011-06-07 10:50:13

+0

@Piotr - 大部分是什么? IT可以通过一个循环来轻松完成;) – 2011-06-07 10:53:25

要找到第三个星期日月:

var date = new DateTime(year, month, 1);

int daysToAdd = (7 - (int)date.DayOfweek) % 7 + 14;

var sunday = date.AddDays(daysToAdd);

我还没有测试它,但它应该表现出总体思路

+0

'每个月的第三个星期天? – V4Vendetta 2011-06-07 11:08:30

+0

为固定的月份,如果你想要每个月都应该在循环中完成12个月 – 2011-06-07 11:12:24

+0

问题不在于找到某个月的第三个星期日,而是在一个日期范围内。所以我想你的方法也需要在某处放置一个循环。但是找到第三个星期天的方式应该没问题,只是假设星期日是一周的第七天,而在DateTime中是第一个。 – 2011-06-07 11:13:27

> using System; using System.Collections.Generic; using System.Linq; 
> using System.Web; using System.Web.UI; using 
> System.Web.UI.WebControls; 
> 
> namespace vbvb { 
>  public partial class _Default : Page 
>  { 
>   protected void Page_Load(object sender, EventArgs e) 
>   { 
>    if (!IsPostBack) 
>    { 
>     DateTime today = DateTime.Today; 
>     DateTime otherday = DateTime.Today.AddYears(1); 
> 
>     Calendar1.TodaysDate = today; 
>     Calendar1.SelectedDate = Calendar1.TodaysDate; 
>     Calendar2.TodaysDate = otherday; 
>     Calendar2.SelectedDate = Calendar2.TodaysDate; 
> 
>     TextBox1.Text = Calendar1.SelectedDate.ToString("dd-MMM-yy"); 
>     TextBox2.Text = Calendar2.SelectedDate.ToString("dd-MMM-yy"); 
> 
>     var items1 = new List<ListItem>(); 
>     items1.Add(new ListItem("", "")); 
>     items1.Add(new ListItem { Text = "Month", Value = "month" }); 
>     items1.Add(new ListItem { Text = "Month + 2", Value = "2month" }); 
>     items1.Add(new ListItem { Text = "Month + 5", Value = "5month" }); 
>     items1.Add(new ListItem { Text = "Year", Value = "year" }); 
>     drpMonths.DataSource = items1; 
>     drpMonths.DataTextField = "Text"; 
>     drpMonths.DataValueField = "Value"; 
>     drpMonths.DataBind(); 
> 
>     var ddWeekdays = new List<ListItem>(); 
>     ddWeekdays.Add(new ListItem("", "")); 
>     ddWeekdays.Add(new ListItem { Text = "Sunday", Value = "sunday" }); 
>     ddWeekdays.Add(new ListItem { Text = "Monday", Value = "Monday" }); 
>     ddWeekdays.Add(new ListItem { Text = "Tuesday", Value = "Tuesday" }); 
>     ddWeekdays.Add(new ListItem { Text = "Wednesday", Value = "Wednesday" }); 
>     ddWeekdays.Add(new ListItem { Text = "Thursday", Value = "Thursday" }); 
>     ddWeekdays.Add(new ListItem { Text = "Friday", Value = "Friday" }); 
>     ddWeekdays.Add(new ListItem { Text = "Saturday", Value = "Saturday" }); 
>     drpWeekdays.DataSource = ddWeekdays; 
>     drpWeekdays.DataTextField = "Text"; 
>     drpWeekdays.DataValueField = "Value"; 
>     drpWeekdays.DataBind(); 
> 
>     var ddinterval = new List<ListItem>(); 
>     ddinterval.Add(new ListItem("", "")); 
>     ddinterval.Add(new ListItem { Text = "1", Value = "1" }); 
>     ddinterval.Add(new ListItem { Text = "2", Value = "2" }); 
>     ddinterval.Add(new ListItem { Text = "3", Value = "3" }); 
>     ddinterval.Add(new ListItem { Text = "4", Value = "4" }); 
>     ddinterval.Add(new ListItem { Text = "5", Value = "5" }); 
>     drpInterval.DataSource = ddinterval; 
>     drpInterval.DataTextField = "Text"; 
>     drpInterval.DataValueField = "Value"; 
>     drpInterval.DataBind(); 
>    } 
>   } 
> 
>   protected void TextBox2_TextChanged(object sender, EventArgs e) 
>   { 
> 
>   } 
> 
>   protected void RadioButton2_CheckedChanged(object sender, EventArgs e) 
>   { 
> 
>   } 
> 
>   protected void Calendar1_SelectionChanged(object sender, EventArgs e) 
>   { 
>    TextBox1.Text = Calendar1.SelectedDate.ToString("dd-MMM-yy"); 
>   } 
> 
>   protected void Calendar2_SelectionChanged(object sender, EventArgs e) 
>   { 
>    TextBox2.Text = Calendar2.SelectedDate.ToString("dd-MMM-yy"); 
>   } 
> 
>   protected void btnSubmit_Click(object sender, EventArgs e) 
>   { 
>    var fromDate = Calendar1.SelectedDate; 
>    var todate = Calendar2.SelectedDate; 
>    var dateList = new List<DateTime>(); 
>    if (fromDate != null && todate != null && (todate > fromDate)) 
>    { 
>     var fDate = fromDate; 
>     bool flag = true; 
>     while (fDate < todate) 
>     { 
>      if (!string.IsNullOrEmpty(drpMonths.SelectedValue)) 
>      { 
>       flag = CheckMonth(fDate); 
>      } 
>      if (flag && !string.IsNullOrEmpty(drpWeekdays.SelectedValue)) 
>      { 
>       flag = CheckDay(fDate); 
>      } 
>      if (flag && !string.IsNullOrEmpty(drpInterval.SelectedValue)) 
>      { 
>       flag = CheckInterval(fDate); 
>      } 
>      if (flag) 
>      { 
>       dateList.Add(fDate); 
>      } 
>      fDate = fDate.AddDays(1); 
>      flag = true; 
>     } 
>     BulletedList1.DataSource = dateList; 
>     BulletedList1.DataBind(); 
>    } 
>   } 
> 
>   public DateTime? LastExecutedMonth = null; 
>   private bool CheckMonth(DateTime date) 
>   { 
>    var retVal = false; 
>    if (LastExecutedMonth == null) 
>    { 
>     LastExecutedMonth = Calendar1.SelectedDate; 
>    } 
>    
>    switch (drpMonths.SelectedValue.ToLower()) 
>    { 
>     case "month": 
>      if (MonthDiff(Convert.ToDateTime(LastExecutedMonth), date) == 1) 
>      { 
>       retVal = true; 
>       if (date == new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1)) 
>       { 
>        LastExecutedMonth = date; 
>       } 
>      } 
>      break; 
>     case "2month": 
>      if (MonthDiff(Convert.ToDateTime(LastExecutedMonth), date) == 2) 
>      { 
>       retVal = true; 
>       if (date == new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1)) 
>       { 
>        LastExecutedMonth = date; 
>       } 
>      } 
>      break; 
>     case "5month": 
>      if (MonthDiff(Convert.ToDateTime(LastExecutedMonth), date) == 5) 
>      { 
>       retVal = true; 
>       if (date == new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1)) 
>       { 
>        LastExecutedMonth = date; 
>       } 
>      } 
>      break; 
>     case "year": 
>      if (MonthDiff(Convert.ToDateTime(LastExecutedMonth), date) == 12) 
>      { 
>       retVal = true; 
>       if (date == new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1)) 
>       { 
>        LastExecutedMonth = date; 
>       } 
>      } 
>      break; 
>    } 
>    return retVal; 
>   } 
> 
>   private bool CheckDay(DateTime date) 
>   { 
>    var retval = false; 
>    switch (drpWeekdays.SelectedValue.ToLower()) 
>    { 
>     case "sunday": 
>      retval = date.DayOfWeek == DayOfWeek.Sunday; 
>      break; 
>     case "monday": 
>      retval = date.DayOfWeek == DayOfWeek.Monday; 
>      break; 
>     case "tuesday": 
>      retval = date.DayOfWeek == DayOfWeek.Tuesday; 
>      break; 
>     case "wednesday": 
>      retval = date.DayOfWeek == DayOfWeek.Wednesday; 
>      break; 
>     case "thursday": 
>      retval = date.DayOfWeek == DayOfWeek.Thursday; 
>      break; 
>     case "friday": 
>      retval = date.DayOfWeek == DayOfWeek.Friday; 
>      break; 
>     case "saturday": 
>      retval = date.DayOfWeek == DayOfWeek.Saturday; 
>      break; 
>    } 
>    return retval; 
>   } 
> 
>   private bool CheckInterval(DateTime date) 
>   { 
>    var flag = false; 
>    switch (drpInterval.SelectedValue.ToLower()) 
>    { 
>     case "1": 
>      flag = date == XthDayOfWeekInMonth(date.Year, date.Month, date.DayOfWeek, 1); 
>      break; 
>     case "2": 
>      flag = date == XthDayOfWeekInMonth(date.Year, date.Month, date.DayOfWeek, 2); 
>      break; 
>     case "3": 
>      flag = date == XthDayOfWeekInMonth(date.Year, date.Month, date.DayOfWeek, 3); 
>      break; 
>     case "4": 
>      flag = date == XthDayOfWeekInMonth(date.Year, date.Month, date.DayOfWeek, 4); 
>      break; 
>     case "5": 
>      flag = date == XthDayOfWeekInMonth(date.Year, date.Month, date.DayOfWeek, 5); 
>      break; 
>    } 
>    return flag; 
>   } 
> 
>   public static DateTime FirstDayOfWeekInMonth(int year, int month, DayOfWeek day) 
>   { 
>    DateTime res = new DateTime(year, month, 1); 
>    int offset = -(res.DayOfWeek - day); 
> 
>    if (offset < 0) 
>     offset += 7; 
> 
>    res = res.AddDays(offset); 
> 
>    return res; 
>   } 
> 
>   public static DateTime LastDayOfWeekInMonth(int year, int month, DayOfWeek day) 
>   { 
>    DateTime res = FirstDayOfWeekInMonth(year, month + 1, day); 
> 
>    res = res.AddDays(-7); 
> 
>    return res; 
>   } 
> 
>   public static DateTime XthDayOfWeekInMonth(int year, int month, DayOfWeek day, int x) 
>   { 
>    DateTime res = DateTime.MinValue; 
> 
>    if (x > 0) 
>    { 
>     res = FirstDayOfWeekInMonth(year, month, day); 
> 
>     if (x > 1) 
>      res = res.AddDays((x - 1) * 7); 
> 
>     res = res.Year == year && res.Month == month ? res : DateTime.MinValue; 
>    } 
> 
>    return res; 
>   } 
> 
>   public static int MonthDiff(DateTime date1, DateTime date2) 
>   { 
>    if (date1.Month < date2.Month) 
>    { 
>     return (date2.Year - date1.Year) * 12 + date2.Month - date1.Month; 
>    } 
>    else 
>    { 
>     return (date2.Year - date1.Year - 1) * 12 + date2.Month - date1.Month + 12; 
>    } 
>   } 
>  } }