2

我做了一个函数来计算一年中的几周,而且效果很好。问题是我需要一种方法来获取一周中的星期一。这是瑞典日历。

下面的代码适用于有 52 周的年份,但有些年份(如 2009 年)有 53 周。然后我从一月得到一个日期作为星期一日期(不可能是正确的)。所以请帮助我让它工作多年。

我可能可以做的是检查一年是否有 53 周,然后做一些检查,但我希望它在没有特殊检查的情况下顺利进行。

这是我想出的:

    public static DateTime GetDateFromWeek(int year, int week)
    {
        //First day of the year
        DateTime d = new DateTime(year, 1, 1);
        GregorianCalendar calendar = new GregorianCalendar(GregorianCalendarTypes.MiddleEastFrench);
        d = calendar.AddWeeks(d, week);
        d = d.AddDays(1 - (double)d.DayOfWeek);
        return d;
    }
4

4 回答 4

4

我认为您的基本问题是假设DateTime d = new DateTime(year, 1, 1);是在今年的第一周,但它可能属于上一年的第 52/53 周。

您将在此处找到解决方案。

于 2010-03-29T10:53:55.637 回答
2

这应该这样做:

public static DateTime GetDateFromWeek(int year, int week)
{
    GregorianCalendar calendar = new GregorianCalendar(GregorianCalendarTypes.MiddleEastFrench);
    DateTime d = new DateTime(year, 12, 31);
    int weeksInYear = calendar.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    int weeksToSubtract = weeksInYear - week;
    d = calendar.AddWeeks(d, -weeksToSubtract);
    d = d.AddDays(1 - (int)d.DayOfWeek);
    return d;
}
于 2010-03-29T11:06:17.743 回答
0

您可能想看看以下问题,我认为这就是您要问的:

获取一周的第一个星期一的日期?

于 2010-03-29T10:44:03.927 回答
-1
if (cmb_mode_of_service.SelectedItem.ToString() == "Weekly Service")
            {
                int year = 0;
                if (cmb_term_of_service.SelectedItem.ToString() == "One Year")
                {
                    year = 1;
                }

                if (cmb_term_of_service.SelectedItem.ToString() == "Two Year")
                {
                    year = 2;
                }

                if (cmb_term_of_service.SelectedItem.ToString() == "three year")
                {
                    year = 3;
                }

                DateTime currentdate = Convert.ToDateTime(service_start_date.Text);
                DateTime Enddate = currentdate.AddYears(+year);


                char c1 = 'A';
                int c2 = 1;
                for (var dt1 = currentdate; dt1 <= Enddate; dt1 = dt1.AddDays(7))
                {
                    DataRow dr = dt.NewRow();
                    dr["SN"] = c2++;
                    dr["serviceid"] = "S4-" + c1++;
                    dr["servicedate"] = dt1.ToString();
                    dr["servicestatus"] = "Pending";
                    dr["serviceexcutive"] = "Not Alowed";
                    dt.Rows.Add(dr);

                }
                dataGridView1.DataSource = dt;

            }
于 2015-04-29T07:28:46.103 回答