找到第三个星期日每个月给两个日期之间
查找第三个星期日的每个月出现以下两个日期给出之间。找到第三个星期日每个月给两个日期之间
开始日期: - 07-06-2011 // DD-MM-YYYY
结束日期: - 07-06-2012 // DD-MM-YYYY
USEC#.NET
这应该做的伎俩:
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;
}
啊......没有看到那里的作业标签。那么应该让他先徘徊多一点。 – 2011-06-07 10:48:45
没有太多使用循环这么简单的任务?这可以在几个数学运算中轻松完成 – 2011-06-07 10:50:13
@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);
我还没有测试它,但它应该表现出总体思路
'每个月的第三个星期天? – V4Vendetta 2011-06-07 11:08:30
为固定的月份,如果你想要每个月都应该在循环中完成12个月 – 2011-06-07 11:12:24
问题不在于找到某个月的第三个星期日,而是在一个日期范围内。所以我想你的方法也需要在某处放置一个循环。但是找到第三个星期天的方式应该没问题,只是假设星期日是一周的第七天,而在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;
> }
> }
> } }
那你有没有尝试什么? – skajfes 2011-06-07 10:38:46
我们不介意在这里帮助人们完成作业,Pritesh,但我们不会在没有你付出一些努力的情况下给你答案。 – DOK 2011-06-07 10:40:56