Получение номера недели в году, начиная с апреля
В настоящее время я использую этот фрагмент:
private string GetCurrentWeek()
{
// Return a string to be used in the TextBox control on the Main Form
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
int Year = DateTime.Now.Year;
int Month = DateTime.Now.Month;
int Day = DateTime.Now.Day;
DateTime Date1 = new DateTime(Year, Month, Day);
Calendar cal = dfi.Calendar;
return cal.GetWeekOfYear(Date1, dfi.CalendarWeekRule, dfi.FirstDayOfWeek).ToString();
}
Чтобы получить текущую неделю года. Который возвращается, как и ожидалось. Хоть. Это начинается с января. Который делает то, что говорит код. Хотя я в идеале ищу, чтобы это началось с апреля. Таким образом, 1-я неделя начинается 6 апреля, а 52-я неделя - 5 апреля (точно так же, как налоговый год в Великобритании). Я искал в Интернете и Google (возможно, с использованием неправильных ключевых слов), но я не могу найти, как выполнить эту задачу с помощью C#
1 ответ
Я предполагаю, что вы хотите, чтобы 1-я неделя начиналась 6 апреля и длилась 7 дней, вместо того, чтобы иметь какое-то правило типа "Недели всегда начинаются по понедельникам". В основном это просто вопрос:
- Выяснение, в каком налоговом году вы находитесь
- Нахождение начала этого налогового года
- Вычитание этой даты из текущей даты
- Разделив результат на 7
Например:
DateTime today = DateTime.Today;
int taxYear = today.Month > 4 || today.Month == 4 && today.Day >= 6
? today.Year : today.Year - 1;
DateTime taxYearStart = new DateTime(taxYear, 4, 6);
TimeSpan elapsedTaxYear = today - taxYearStart;
int days = elapsedTaxYear.Days;
int taxYearWeek = (days / 7) + 1;
Конечно, вы также можете использовать Noda Time:
// Usually inject this, using SystemClock.Instance for production
IClock clock = ...;
// For the UK, use DateTimeZoneProviders.Tzdb["Europe/London"];
DateTimeZone zone = ...;
// This will be simpler in Noda Time 2.0 with ZonedClock
LocalDate today = clock.Now.InZone(zone).LocalDateTime.Date;
int taxYear = today.Month > 4 || today.Month == 4 && today.Day >= 6
? today.Year : today.Year - 1;
LocalDate taxYearStart = new LocalDate(taxYear, 4, 6);
int days = Period.Between(taxYearStart, today, PeriodUnits.Days).Days;
int taxYearWeek = (days / 7) + 1;