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

1

Я использую этот фрагмент:

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();
 }

Чтобы получить текущую неделю года. Что возвращается, как ожидалось. Хоть. Это начинается с января. Что делает то, что говорит код. Хотя, я идеально ищу его, чтобы начать с апреля. Таким образом, первая неделя начнется 6 апреля, а 5-я неделя - 5 апреля (точно так же, как и UK Tax Year). Я искал интернет и google (возможно, используя неправильные ключевые слова), но я не могу узнать, как выполнить эту задачу, используя С#

  • 0
    @RT Разве это не добавит 3 месяца на текущий месяц? Т.е. в настоящее время август. Что вернется в ноябре, и будет +1 на каждом начале месяца? Т.е. сентябрь будет декабрь?
  • 0
    Чтение @TimSchmelter, которое так или иначе дает мне идею, что использование новой инициализации DateTime может решить эту проблему
Показать ещё 1 комментарий
Теги:

1 ответ

3
Лучший ответ

Я предполагаю, что вы хотите, чтобы неделя 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;
  • 0
    Хотя это выглядит многообещающе. Не имея большого опыта работы с C #, так как недавно поднял его. Visual 2013 выдает следующую ошибку Ошибка 3 Оператор «-» не может быть применен к операндам типа «System.DateTime» и «int»
  • 0
    @DarylGill: Извините, опечатка - это должно было вычесть taxYearStart. Починю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню