Получение номера недели в году, начиная с апреля

В настоящее время я использую этот фрагмент:

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;
Другие вопросы по тегам