我需要在C#中找到给定日期范围的周数。
例如:2014年1月1日至2014年1月14日之间的日期同样,周数也是第1周,第2周和第3周。
感谢。
答案 0 :(得分:2)
这应该有效:
public List<int> Weeks(DateTime start, DateTime end)
{
List<int> weeks=new List<int>();
var Week=(int)Math.Floor((double)start.DayOfYear/7.0); //starting week number
for (DateTime t = start; t < end; t = t.AddDays(7))
{
weeks.Add(Week);
Week++;
}
return weeks;
}
所有这一切都是获取开始日期的一周,然后一次循环一周,直到你到达结束日期,增加一周并将其添加到周列表。
答案 1 :(得分:1)
不是最聪明的方式,但有效!
var d1 = new DateTime(2014, 1, 1);
var d2 = new DateTime(2014, 1, 14);
var currentCulture = CultureInfo.CurrentCulture;
var weeks = new List<int>();
for (var dt = d1; dt < d2; dt =dt.AddDays(1))
{
var weekNo = currentCulture.Calendar.GetWeekOfYear(
dt,
currentCulture.DateTimeFormat.CalendarWeekRule,
currentCulture.DateTimeFormat.FirstDayOfWeek);
if(!weeks.Contains(weekNo))
weeks.Add(weekNo);
}
答案 2 :(得分:0)
好的,让我们从一个简单的,未经优化的例子开始。我们只是检查这些日期之间的每个日期,并检查一年中的哪一周。
我们可以用一个简单的循环来做到这一点:
var end = new DateTime(2014, 1, 14);
for (var date = new DateTime(2014, 1, 1); date <= end; date = date.AddDays(1))
{
}
这将简单地在两个日期之间循环。现在我们需要检查那些日子以确定他们的星期几。要做到这一点,你需要考虑一些事项:一周的第一天是什么?星期日?星期一?我们假设格里高利历吗?
对于我们的例子,让我们假设一周的第一天是星期日,我们确实使用公历。然后我们将检查每个日期,并使用HashSet
var weekNumber = new HashSet<int>();
var end = new DateTime(2014, 1, 14);
var calendar = new GregorianCalendar();
for (var date = new DateTime(2014, 1, 1); date <= end; date = date.AddDays(1))
{
weekNumber.Add(calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday));
}
weekNumber
Hashset现在包含一年中的几周。
这是优化的吗?不会。它会检查的日期多于它需要的日期,但实施很简单且足够快。优化可以作为单独的任务完成。
答案 3 :(得分:0)
易。这是确定单个日期的一年中的一周的代码。这应该让你去:
int WeekOfYear(DateTime date, DayOfWeek dayOfWeekStart) {
//Find the first day of the year that's the start of week day. If it's not 1/1,
//then we have a first partial week.
bool firstPartialWeek = false;
DateTime firstFullWeekStart = new DateTime(date.Year, 1, 1);
while(firstFullWeekStart.DayOfWeekDay != dayOfWeekStart) {
firstFullWeekStart = firstOfWeek.AddDays(1);
firstPartialWeek = true;
}
//Return the week by integer dividing the date difference by seven,
//and adding in the potential first partial week
return (firstPartialWeek ? 1 : 0) + ((date - firstFullWeekStart).TotalDays / 7);
}