C #: Получить все номера недели в течение 2 дат глобализации / ISO 8601 совместимы - PullRequest
1 голос
/ 01 ноября 2010

у меня есть

startdate 2010-01-01 (я просто предполагаю, что это первый день недели)

и

enddate 2010-07-31 (я предполагаю, что это первый день недели)

Я хочу, чтобы из метода возвращались номера всех недель для каждого первого дня недели для

выше времени. Я не могу предположить, что первый день недели всегда понедельник, потому что мой пользователь

может быть из Швеции , США или любого другого. Алгоритм должен быть совместим с ISO 8601.

Окончательный результат должен выглядеть примерно так:

2010-01-01 , 1
2010-01-08 , 2
2010-01-15 , 3
2010-01-22 , 4
...
2010-07-31 , ~28

Да, я знаю, что в Google полно ссылок на эту тему, но никто не делает это правильно. Они все

предположим, что понедельник - первый день недели. Может быть, некоторые из богов c # на SO проходят мимо: P

EDIT:

Что вы скажете этому коду:

public static int GetWeekNumber(DateTime dtPassed)
        {
            CultureInfo ciCurr = CultureInfo.CurrentCulture;
            int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstDay, DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek);
            return weekNum;
        }

Я нашел его частично в Google и немного изменил.

Ответы [ 4 ]

2 голосов
/ 01 ноября 2010

Возможно, вы захотите взглянуть на CultureInfo.CurrentCulture.Calendar.GetWeekOfYear

Редактировать:

Небольшое исправление для вашего собственного примера, плюс расширение для облегчения использования;)

public static int GetWeekNumber(this DateTime dtPassed)
{
    CultureInfo ciCurr = CultureInfo.CurrentCulture;
    DateTimeFormatInfo fiCurr = DateTimeFormatInfo.CurrentInfo;
    int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, fiCurr.CalendarWeekRule, fiCurr.FirstDayOfWeek);
    return weekNum;
}

этот инфронт DateTime позволяет вам использовать его, как если бы это была функция для объекта DateTime ..

чтобы вы могли сделать

int week = DateTime.Now.GetWeekNumber();
1 голос
/ 13 мая 2011

Calendar.GetWeekOfYear не совместим с ISO 8601 (см. Комментарий сообщества).

Бесплатная библиотека периодов времени для .NET включает класс Неделя , совместимая с ISO 8601:

// ----------------------------------------------------------------------
public int GetWeekOfYear( DateTime moment )
{
  return new Week( moment ).WeekOfYear;
} // GetWeekOfYear
1 голос
/ 01 ноября 2010
public IList<int> GetWeekNumbers(DateTime startDate, DateTime endDate)
{
    CultureInfo currentCulture = CultureInfo.CurrentCulture;
    DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
    var result = new List<int>();

    for (DateTime tm = startDate; tm <= endDate; tm = tm.AddDays(7))
    {
      result.Add(currentCulture.Calendar.GetWeekOfYear(tm, dfi.CalendarWeekRule, 
                                              dfi.FirstDayOfWeek));
    }

    return result;
}
1 голос
/ 01 ноября 2010
var week = new DateTime(2010, 1, 1).AddDays(7 * i);
Console.Out.WriteLine("week = {0}", week);

Где i - номер недели, которую вы хотите.Поскольку это тип DateTime, вы можете делать с ним все, что хотите, в зависимости от локали.Это заняло бы немного работы по обработке високосных лет.Вы можете использовать DateTime.IsLeapYear(), чтобы определить, является ли это високосным годом, и добавить дополнительный день, если дата больше 2 / 29.

...