2014-08-31 3 views
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 (возможно, используя неправильные ключевые слова), но я не могу узнать, как выполнить эту задачу, используя C#

+0

@ R.T. Разве это не добавит 3 месяца на текущий месяц? То есть в августе. Это вернет ноябрь и будет +1 на каждое начало месяца? Т.е. сентябрь будет декабрь? –

+0

@TimSchmelter читает, что почему-то дает мне представление о том, что использование новой инициализации 'DateTime' может решить эту проблему –

+0

' New DateTime (Year, 5,6); 'Не работает –

ответ

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 выдает следующую ошибку ** Ошибка Оператор '-' не может быть применен к операндам типа 'System.DateTime' и 'int' ** –

+0

@DarylGill: К сожалению, опечатка - это должно быть вычитание taxYearStart. Починю. –

+0

Первый пример работает без заминки. Благодарим за предоставленную информацию. Изучит код и исследует библиотеки, перечисленные в первом и втором примерах. Еще раз спасибо –

Смежные вопросы