回答
試試這個:
static int CountDays(DayOfWeek day, DateTime start, DateTime end)
{
TimeSpan ts = end - start; // Total duration
int count = (int)Math.Floor(ts.TotalDays/7); // Number of whole weeks
int remainder = (int)(ts.TotalDays % 7); // Number of remaining days
int sinceLastDay = (int)(end.DayOfWeek - day); // Number of days since last [day]
if (sinceLastDay < 0) sinceLastDay += 7; // Adjust for negative days since last [day]
// If the days in excess of an even week are greater than or equal to the number days since the last [day], then count this one, too.
if (remainder >= sinceLastDay) count++;
return count;
}
添加儘可能小的數字,以使第一天成爲星期一。減去最小可能的數字,使最後一天成爲星期一。計算天數的差值除以7.
由於您使用的是C#,如果您使用的是C#3.0,則可以使用LINQ。
假設你有一個數組/列表/ IQueryable的等包含您的日期作爲時間類型:
DateTime[] dates = { new DateTime(2008,10,6), new DateTime(2008,10,7)}; //etc....
var mondays = dates.Where(d => d.DayOfWeek == DayOfWeek.Monday); // = {10/6/2008}
補充:
不知道你的意思是將它們分組,並對其計數,但這裏是如何這樣做,在LINQ以及:
var datesgrouped = from d in dates
group d by d.DayOfWeek into grouped
select new { WeekDay = grouped.Key, Days = grouped };
foreach (var g in datesgrouped)
{
Console.Write (String.Format("{0} : {1}", g.WeekDay,g.Days.Count());
}
下面是一些僞代碼:
DifferenceInDays(Start, End)/7 // Integer division discarding remainder
+ 1 if DayOfWeek(Start) <= DayImLookingFor
+ 1 if DayOfWeek(End) >= DayImLookingFor
- 1
其中DifferenceInDays
返回End - Start
以天爲單位,而DayOfWeek
以星期返回整數。 DayOfWeek
使用哪種映射並不重要,只要它在增加並與DayImLookingFor
匹配即可。
請注意,此算法假定日期範圍是包含性的。如果End
不應該是該範圍的一部分,則必須稍微調整算法。
翻譯爲C#僅供讀者參考。
看看不同的算法來計算每週的星期幾很有意思,並且@Gabe Hollombe指出WP在這個主題上是一個好主意(我記得大約二十年前在COBOL中實現Zeller's Congruence),但它是相當的當他們問他們什麼時候是什麼時候,向他們傳遞一個時鐘藍圖的路線。
在C#:
private int CountMondays(DateTime startDate, DateTime endDate)
{
int mondayCount = 0;
for (DateTime dt = startDate; dt < endDate; dt = dt.AddDays(1.0))
{
if (dt.DayOfWeek == DayOfWeek.Monday)
{
mondayCount++;
}
}
return mondayCount;
}
這當然不評價 「Mondayness」 的結束日期,所以如果這是需要的,使for循環評估
dt < endDate.AddDays(1.0)
轉換的日期朱利安日數,然後做一點數學。由於週一是零國防部7,你可以做的計算是這樣的:
JD1=JulianDayOf(the_first_date)
JD2=JulianDayOf(the_second_date)
Round JD1 up to nearest multiple of 7
Round JD2 up to nearest multiple of 7
d = JD2-JD1
nMondays = (JD2-JD1+7)/7 # integer divide
我有一個報告了類似的問題。我需要兩個日期之間的工作日數。 我本來可以通過日期和計數,但離散的數學訓練不會讓我。這是我在VBA中編寫的一個函數,用於獲取兩個日期之間的工作日數量。我相信.net有類似的WeekDay功能。
1
2 ' WorkDays
3 ' returns the number of working days between two dates
4 Public Function WorkDays(ByVal dtBegin As Date, ByVal dtEnd As Date) As Long
5
6 Dim dtFirstSunday As Date
7 Dim dtLastSaturday As Date
8 Dim lngWorkDays As Long
9
10 ' get first sunday in range
11 dtFirstSunday = dtBegin + ((8 - Weekday(dtBegin)) Mod 7)
12
13 ' get last saturday in range
14 dtLastSaturday = dtEnd - (Weekday(dtEnd) Mod 7)
15
16 ' get work days between first sunday and last saturday
17 lngWorkDays = (((dtLastSaturday - dtFirstSunday) + 1)/7) * 5
18
19 ' if first sunday is not begin date
20 If dtFirstSunday <> dtBegin Then
21
22 ' assume first sunday is after begin date
23 ' add workdays from begin date to first sunday
24 lngWorkDays = lngWorkDays + (7 - Weekday(dtBegin))
25
26 End If
27
28 ' if last saturday is not end date
29 If dtLastSaturday <> dtEnd Then
30
31 ' assume last saturday is before end date
32 ' add workdays from last saturday to end date
33 lngWorkDays = lngWorkDays + (Weekday(dtEnd) - 1)
34
35 End If
36
37 ' return working days
38 WorkDays = lngWorkDays
39
40 End Function
private System.Int32 CountDaysOfWeek(System.DayOfWeek dayOfWeek, System.DateTime date1, System.DateTime date2)
{
System.DateTime EndDate;
System.DateTime StartDate;
if (date1 > date2)
{
StartDate = date2;
EndDate = date1;
}
else
{
StartDate = date1;
EndDate = date2;
}
while (StartDate.DayOfWeek != dayOfWeek)
StartDate = StartDate.AddDays(1);
return EndDate.Subtract(StartDate).Days/7 + 1;
}
我今天有同樣的需求。我開始使用函數,因爲我不瞭解函數,因爲函數不是線性函數。
我必須要糾正
DifferenceInDays(Start, End)/7 // Integer division discarding remainder
+ 1 if DayOfWeek(Start) <= DayImLookingFor
+ 1 if DayOfWeek(End) >= DayImLookingFor
- 1
到
DifferenceInDays(Start, End)/7 // Integer division discarding remainder
+ 1 if DayImLookingFor is between Start.Day and End.Day
使用功能之間的返回真,如果從一開始天開始,我們的endday指定見面之前先dayImLookingFor。
我已經通過計算當日從朝九特派到其他二級天數完成的功能之間:
private int CountDays(DateTime start, DateTime end, DayOfWeek selectedDay)
{
if (start.Date > end.Date)
{
return 0;
}
int totalDays = (int)end.Date.Subtract(start.Date).TotalDays;
DayOfWeek startDay = start.DayOfWeek;
DayOfWeek endDay = end.DayOfWeek;
///look if endDay appears before or after the selectedDay when we start from startDay.
int startToEnd = (int)endDay - (int)startDay;
if (startToEnd < 0)
{
startToEnd += 7;
}
int startToSelected = (int)selectedDay - (int)startDay;
if (startToSelected < 0)
{
startToSelected += 7;
}
bool isSelectedBetweenStartAndEnd = startToEnd >= startToSelected;
if (isSelectedBetweenStartAndEnd)
{
return totalDays/7 + 1;
}
else
{
return totalDays/7;
}
}
public List<DateTime> GetSelectedDaysInPeriod(DateTime startDate, DateTime endDate, List<DayOfWeek> daysToCheck)
{
var selectedDates = new List<DateTime>();
if (startDate >= endDate)
return selectedDates; //No days to return
if (daysToCheck == null || daysToCheck.Count == 0)
return selectedDates; //No days to select
try
{
//Get the total number of days between the two dates
var totalDays = (int)endDate.Subtract(startDate).TotalDays;
//So.. we're creating a list of all dates between the two dates:
var allDatesQry = from d in Enumerable.Range(1, totalDays)
select new DateTime(
startDate.AddDays(d).Year,
startDate.AddDays(d).Month,
startDate.AddDays(d).Day);
//And extracting those weekdays we explicitly wanted to return
var selectedDatesQry = from d in allDatesQry
where daysToCheck.Contains(d.DayOfWeek)
select d;
//Copying the IEnumerable to a List
selectedDates = selectedDatesQry.ToList();
}
catch (Exception ex)
{
//Log error
//...
//And re-throw
throw;
}
return selectedDates;
}
四年後,我想我會運行一個測試:
[TestMethod]
public void ShouldFindFridaysInTimeSpan()
{
//reference: http://stackoverflow.com/questions/248273/count-number-of-mondays-in-a-given-date-range
var spanOfSixtyDays = new TimeSpan(60, 0, 0, 0);
var setOfDates = new List<DateTime>(spanOfSixtyDays.Days);
var now = DateTime.Now;
for(int i = 0; i < spanOfSixtyDays.Days; i++)
{
setOfDates.Add(now.AddDays(i));
}
Assert.IsTrue(setOfDates.Count == 60,
"The expected number of days is not here.");
var fridays = setOfDates.Where(i => i.DayOfWeek == DayOfWeek.Friday);
Assert.IsTrue(fridays.Count() > 0,
"The expected Friday days are not here.");
Assert.IsTrue(fridays.First() == setOfDates.First(i => i.DayOfWeek == DayOfWeek.Friday),
"The expected first Friday day is not here.");
Assert.IsTrue(fridays.Last() == setOfDates.Last(i => i.DayOfWeek == DayOfWeek.Friday),
"The expected last Friday day is not here.");
}
中號y使用TimeSpan
有點過分---實際上我想直接查詢TimeSpan
。
這將返回一個整數集顯示一週的每一天有多少次的日期範圍
int[] CountDays(DateTime firstDate, DateTime lastDate)
{
var totalDays = lastDate.Date.Subtract(firstDate.Date).TotalDays + 1;
var weeks = (int)Math.Floor(totalDays/7);
var result = Enumerable.Repeat<int>(weeks, 7).ToArray();
if (totalDays % 7 != 0)
{
int firstDayOfWeek = (int)firstDate.DayOfWeek;
int lastDayOfWeek = (int)lastDate.DayOfWeek;
if (lastDayOfWeek < firstDayOfWeek)
lastDayOfWeek += 7;
for (int dayOfWeek = firstDayOfWeek; dayOfWeek <= lastDayOfWeek; dayOfWeek++)
result[dayOfWeek % 7]++;
}
return result;
}
還是有輕微的變化,它可以讓你做FirstDate.TotalDaysOfWeeks(SecondDate)內發生,並返回一個字典
public static Dictionary<DayOfWeek, int> TotalDaysOfWeeks(this DateTime firstDate, DateTime lastDate)
{
var totalDays = lastDate.Date.Subtract(firstDate.Date).TotalDays + 1;
var weeks = (int)Math.Floor(totalDays/7);
var resultArray = Enumerable.Repeat<int>(weeks, 7).ToArray();
if (totalDays % 7 != 0)
{
int firstDayOfWeek = (int)firstDate.DayOfWeek;
int lastDayOfWeek = (int)lastDate.DayOfWeek;
if (lastDayOfWeek < firstDayOfWeek)
lastDayOfWeek += 7;
for (int dayOfWeek = firstDayOfWeek; dayOfWeek <= lastDayOfWeek; dayOfWeek++)
resultArray[dayOfWeek % 7]++;
}
var result = new Dictionary<DayOfWeek, int>();
for (int dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++)
result[(DayOfWeek)dayOfWeek] = resultArray[dayOfWeek];
return result;
}
我遇到了一個稍微簡單的方法來解決這個問題,使用LINQ。
public static int NumberOfFridays(DateTime start, DateTime end)
{
return start.GetDaysInBetween(end, inclusive: true).Count(d => d.DayOfWeek == DayOfWeek.Friday);
}
希望有所幫助。
- 1. 在給定的日期範圍內計算星期一
- 2. Redshift計算給定時間範圍內星期一的數量
- 3. 計算假期:Oracle中給定日期範圍查詢中的星期六和星期日的數量
- 4. 計算日期範圍內的星期數
- 5. 計算日期範圍內的星期數
- 6. 計算每週計劃的日期範圍內的預定日期的數量
- 7. 計算日期範圍內的天數
- 8. 計算日期範圍內的天數
- 9. Python計算給定日期範圍內的記錄數
- 10. SQL Server:如何計算給定日期範圍內的行數?
- 11. 計算jquery中日期範圍內假期的數量
- 12. 在日期範圍內計算天數?
- 13. 用日期範圍內的星期幾
- 14. 在日期範圍內計算每個日期的行數
- 15. SQL日期範圍計算
- 16. 計算日期範圍
- 17. 計算一個星期內一個特定單詞出現在一個星期內的次數,其範圍在
- 18. 用C語言計算給定日期(即星期日或星期一或星期幾等)的總數
- 19. php函數獲取日期範圍內的所有星期一
- 20. 計算日期範圍內每個日期的銷售數量,postgresql
- 21. 計算C#中日期範圍內的假期數
- 22. 計算下一個星期一到指定日期的日期
- 23. 在日期範圍內計算日期範圍中的月份的軌跡
- 24. 在日期範圍內計算丟失的日期序列
- 25. 計數的日期範圍內有多少天是另一個日期範圍
- 26. Excel按日期範圍計算日期範圍內的不同值
- 27. 實體框架:如何計算其他日期範圍內的日期範圍
- 28. 計算預定義日期範圍內的天數
- 29. 如何查找Android上給定星期的日期範圍?
- 30. Python2:在指定日期範圍內檢索星期日 - 星期六星期開始/結束日期
哪種編程語言? – Ady 2008-10-29 20:21:42