Похоже, что язык предоставляет методы даты / дня для данной даты. Если кому-то было интересно, вы можете прочитать о конгруэнтности Зеллера .
Я не думаю, что это то, что они хотели, чтобы вы делали, но вы можете найти день недели первого дня месяца из этого. Теперь, когда я подумал об этом, вы можете найти день недели для данного дня как N
и получить его по модулю 7.
Ой, подождите, это N-е вхождение дня недели (например, воскресенья) или как N-е дня недели месяца! Хорошо, я вижу примеры.
Может быть, будет иметь значение, если вы сможете построить дату, например, 1-го числа месяца ...
Учитывая, что это N-е вхождение дня недели , и что вы не можете использовать любой тип данных datetime, и что у вас есть доступ как к получению дня недели, так и к получению дня месячные функции. Воскресенье будет ноль?
1) Во-первых, день недели должен соответствовать указанному дню недели.
2) N должно быть не менее 1 и не более 4.
3) День месяца будет варьироваться между n * 7 * dayOfWeek + 1 и n * 7 * dayOfWeek + 6 для того же n.
- Дай мне подумать об этом. Если бы воскресенье было первым .. 0 * 7 * 0 + 1 = 1, а суббота 6-го была бы 0 * 7 * 0 + 6.
Думаю, 1 и 3 выше достаточно, так как функция получения дня месяца не должна нарушать 2.
(* first try, this code sucks *)
function isNthGivenDayInMonth(date : dateTime;
dow : dayOfWeek;
N : integer) : boolean;
var B, A : integer (* on or before and after day of month *)
var Day : integer (* day of month *)
begin
B := (N-1)*7 + 1; A := (N-1)*7 + 6;
D := getDayOfMonth(date);
if (dow <> getDayOfWeek(date)
then return(false)
else return( (B <= Day) and (A >= Day) );
end; (* function *)
Надеюсь, что в этом нет ошибки!
[править: суббота была бы 7-й, а верхняя граница выше (N-1)*7 + 7
.]
Ваше решение выглядит так, как будто бы оно совпадало с 2 разными неделями? Похоже, он всегда будет возвращать ноль в воскресенье? Должен был сделать псевдокод в C # .. короткое замыкание &&, как мой, если ..
эй, разве не должен воскресенье первый матч для N = 1 в месяцы, которые начинаются в воскресенье?
d/ 7 == n
Это приведет к (either 0 or 1)/7 == 1
, что не может быть правильным! Твой ||
тоже ловит (n-1)
, у Роберта это есть. Идите с ответом Роберта Вагнера! Это всего 2 строки, короткая - это хорошо! Имея (Day-1) mod 7
[редактировать: (Day-1) div 7
]
устраняет мои ненужные переменные и 2 строки настройки.
Для протокола это следует проверить для граничных случаев и т. Д., Например, что если 31 августа было воскресенье или суббота.
[править: надо было проверять регистр конца недели тоже. Извините!]