Как я могу получить номер недели месяца на основе номера года недели (т.е. недели 33) - PullRequest
0 голосов
/ 21 сентября 2019

Мне интересно, как я могу рассчитать, что такое неделя месяца на основе порядкового номера недели в году.Например, я имею в виду 33-ю неделю, я должен знать, что это 2-я неделя августа.Я уже рассчитал месяцы, но теперь я имею дело с неделями.

У меня уже есть решение, но оно мне кажется грязным ..

Вот код:

var data = query.GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.CreatedDate ?? DateTime.UtcNow, CalendarWeekRule.FirstDay, DayOfWeek.Monday))
.Select(article => new ArticleSimpleObject
{
    Week = GetWeekNumberOfMonth(article.FirstOrDefault().CreatedDate.Value),
    Amount = article.Sum(x => x.Amount),
    Month = article.FirstOrDefault().CreatedDate.Value.Month
});

А вот метод, который я использовал для получения номеров недели:

 private static int GetWeekNumberOfMonth(DateTime date)
 {
      date = date.Date;
      DateTime firstMonthDay = new DateTime(date.Year, date.Month, 1);
      DateTime firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
      if (firstMonthMonday > date)
      {
          firstMonthDay = firstMonthDay.AddMonths(-1);
          firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
       }
      return (date - firstMonthMonday).Days / 7 + 1;
  }

Когда я писал, ребята, это решение работает,

, но мне лично это не нравится, наверное, тамэто более элегантное решение, и поэтому я разместил этот вопрос, чтобы помочь себе и будущим читателям, если какой-то опытный человек поможет нам решить эту проблему:)

Может быть, это можно решить на основе класса Календаря https://docs.microsoft.com/en-us/dotnet/api/system.globalization.calendar?view=netframework-4.8

Я попробовал какой-то вариант, но я даже не был близок к его решению ..

Спасибо, ребята

Приветствия

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вы можете написать несколько общих расширений, чтобы вычислить это немного проще.

Во-первых, вам нужна первая дата недели, начинающаяся с определенного дня недели для даты:

public static DateTime FirstDateOfWeekStarting(this DateTime aDate, DayOfWeek dow) => aDate.Date.AddDays((int)dow - (int)aDate.DayOfWeek);

Затем вы можете легко преобразовать день месяца этой первой даты в номер недели в месяце:

public static int WeekStartingDOWNumOfMonth(this DateTime aDate, DayOfWeek dow) => (aDate.FirstDateOfWeekStarting(dow).Day-1) / 7 + 1;

И для вашего конкретного случая недель, начинающихся с понедельника,

public static int WeekStartingMonNumOfMonth(this DateTime aDate) => aDate.WeekStartingDOWNumOfMonth(DayOfWeek.Monday);
0 голосов
/ 23 сентября 2019

Один из подходов состоит в том, чтобы вычесть неделю года 1-го числа месяца даты из недели года даты.Вот так:

void Main()
{
    Console.WriteLine(DateTime.Now.GetWeekOfMonth());       
}

public static class MyDateTimeExtensions
{
    private static GregorianCalendar _calendar = new GregorianCalendar();

    public static int GetWeekOfMonth(this DateTime date)
    {
        return 
            date.GetWeekOfYear()
            - new DateTime(date.Year, date.Month, 1).GetWeekOfYear()
            + 1;
    }

    private static int GetWeekOfYear(this DateTime date)
    {
        return _calendar.GetWeekOfYear(
            date, 
            CalendarWeekRule.FirstDay, 
            DayOfWeek.Sunday);
    }
}

Вывод 4 для текущей даты: 23 сентября 2019 года.

...