Maideen Abdul Kader Ответов: 2

Как рассчитать количество дней между датами, исключающими специальные дни?


Привет

У меня есть проблема рассчитать нет дней между двумя датами

Теперь я использовал приведенный ниже код,работающий нормально, который исключает субботу, воскресенье

Но реальные проблемы, особый праздник, такой как Рождество/Новый год и Национальный день страны или любой другой правительственный праздник.

Пожалуйста, посоветуйте мне

Мейден

Что я уже пробовал:

Public Shared Function GetBusinessDays(ByVal startD As DateTime, ByVal endD As DateTime) As Double
    Dim calcBusinessDays As Double = 1 + ((endD - startD).TotalDays * 5 - (startD.DayOfWeek - endD.DayOfWeek) * 2) / 7
    If endD.DayOfWeek = DayOfWeek.Saturday Then calcBusinessDays -= 1
    If startD.DayOfWeek = DayOfWeek.Sunday Then calcBusinessDays -= 1
    Return calcBusinessDays
End Function

2 Ответов

Рейтинг:
14

Graeme_Grant

Вы пробовали поиск в Google? Вот вам пример: c# calc рабочие дни[^]

Который нашел это: c# - вычислить количество рабочих дней между двумя датами? - переполнение стека[^]


Рейтинг:
0

Maciej Los

Ну, нет никакого "общего списка праздников". Это зависит от страны (национальные, государственные праздники) и религии. Видеть: Национальный день - Википедия[^].


Самый простой способ определить, является ли текущий день праздником, - это определить их список. Обратите внимание, что некоторые праздники зависят от Пасхи...

Sub Main

	Dim startDate As DateTime = New DateTime(2019,1,1)
	Dim ThisYear As List(Of KeyValuePair(Of DateTime, Boolean)) = Enumerable.Range(0, 365) _
		.Select(Function(x) New KeyValuePair(Of DateTime, Boolean)(startDate.AddDays(x), IsHoliday(startDate.AddDays(x)))) _
		.ToList()

	'list is ready to use...
	
End Sub

' Define other methods and classes here
Function Easter(lyear As Long) As DateTime
	Dim C As Long, N As Long, K As Long, i As Long, J As Long, L As Long, M As Long, D As Long
	
	C = lyear \ 100
	N = lyear - 19 * (lyear \ 19)
	K = (C - 17) \ 25
	i = C - C \ 4 - (C - K) \ 3 + 19 * N + 15
	i = i - 30 * (i \ 30)
	i = i - (i \ 28) * (1 - (i \ 28) * (29 \ (i + 1)) * ((21 - N) \ 11))
	J = lyear + lyear \ 4 + i + 2 - C + C \ 4
	J = J - 7 * (J \ 7)
	L = i - J
	M = 3 + (L + 40) \ 44
	D = L + 28 - 31 * (M \ 4)

    Return New DateTime(lyear, M, D)

End Function

Function IsHoliday(ByVal thisday As DateTime) As Boolean

	Dim holidays As List(Of DateTime) = New List(Of DateTime)
	holidays.Add(New DateTime(thisday.Year, 1, 1)) 'New Year
	holidays.Add(New DateTime(thisday.Year, 1, 6)) 'Epiphany holiday 
	holidays.Add(Easter(thisday.Year)) 'Easter
	holidays.Add(Easter(thisday.Year).AddDays(1)) 'Easter Monday
	holidays.Add(Easter(thisday.Year).AddDays(49)) 'Whit Monday (48 days after Easter)
	holidays.Add(New DateTime(thisday.Year, 5, 1)) '1 May Labour Day
	holidays.Add(New DateTime(thisday.Year, 5, 3)) 'Constitution of 3th May - polish National Holiday
	holidays.Add(Easter(thisday.Year).AddDays(60)) 'Corpus Christi
	holidays.Add(New DateTime(thisday.Year, 8, 15)) 'Assumption of Mary
	holidays.Add(New DateTime(thisday.Year, 11, 1)) 'All Saints Day
	holidays.Add(New DateTime(thisday.Year, 12, 25)) 'Christmas Day
	holidays.Add(New DateTime(thisday.Year, 12, 26)) 'a second day of Christmas
	
	Return holidays.Contains(thisday)

End Function


Примечание: Easter функция выглядит некрасиво, но работает отлично!


Richard Deeming

NB: То Easter функция работает для "Западной" Пасхи, но не для "Восточной" Пасхи, которая основана на юлианском календаре. :)
https://en.wikipedia.org/wiki/Easter#Date[^]

Maciej Los

Хорошая мысль!
Я вырос в западной культуре, так что...
А оправдан ли я? :улыбка:

Richard Deeming

Я думаю, что вы в порядке - ОП еще не думал о странах, где выходные дни-пятница + суббота, а не суббота + воскресенье. :)

Maciej Los

:смеяться:
- Спасибо, Ричард.