Почему нет DateTime.AddWeeks () и как я могу получить объект DateTime 52 недели назад? - PullRequest
13 голосов
/ 27 июля 2011

У объекта System.DateTime есть методы для AddYears(), AddMonths(), AddDays(), AddSeconds() и т. Д.

Я заметил, что AddWeeks() нет.Почему это так?

Кроме того, мое требование - получить цену за 52 недели назад.Я знаю, что это равняется 1 году, но они были конкретны около 52 недель.

Могу ли я сделать то же самое:

yearOldPrice = _priceService.GetPriceForDate(price.Date.AddYears(-1));

как

yearOldPrice = _priceService.GetPriceForDate(price.Date.AddDays(-7 * 52));

Я спрашиваю, исходя из предположения, что .AddDays(-7 * 52) совпадает с .AddWeeks(-52), потому что в неделе 7 дней.

Ответы [ 8 ]

22 голосов
/ 27 июля 2011

Как вы отметили в своем вопросе, в отличие от Года и Месяца, всегда есть ровно 7 дней в неделю (в любом случае, в моем календаре), поэтому очень мало что можно получить, если использовать метод AddWeeks, когда все, что вам нужно, do is .AddDays (недели * 7). Хотя вы должны подвергнуть сомнению логику, когда у них есть AddMinutes и AddHours! Черт бы их побрал!

Вы всегда можете создать метод расширения для .AddWeeks, если он действительно вас беспокоит:

public static class DateTimeExtensions
{
    public static DateTime AddWeeks(this DateTime dateTime, int numberOfWeeks)
    {
        return dateTime.AddDays(numberOfWeeks * 7);
    }
}

И, как отмечали другие, год - это не 52 недели.

5 голосов
/ 12 марта 2015

Абстрактный Calendar класс реализует метод, который вам нужен после , вы можете использовать календарь вашей локали или создать объект класса, который его реализует:

DateTime dt = CultureInfo.InvariantCulture.Calendar.AddWeeks(datetime, weeks);

GregorianCalendar gc = new GregorianCalendar();
DateTime dt = gc.AddWeeks(datetime, weeks);
2 голосов
/ 27 июля 2011

Ultimatey Я ожидаю, что AddWeeks отсутствует просто для того, чтобы избежать огромного количества методов. Может быть, добавить метод расширения:

public static DateTime AddWeeks(this DateTime from, int count) {
    return from.AddDays(7 * count);
}
1 голос
/ 27 июля 2011

Это было бы немного по-другому. Вычитание 52 недель означает вычитание 364 дней, тогда как год составляет 365 (366 в високосные годы).

Вероятно, нет AddWeeks(), потому что достаточно просто сделать AddDays(-7 * numWeeks), чтобы вычесть недели.

1 голос
/ 27 июля 2011

yearOldPrice = _priceService.GetPriceForDate(price.Date.AddDays(-7 * 52); - это то, что вы хотите.Обратите внимание, что добавление года и добавление 52 недель отличается.

Если вы действительно хотите, вы можете использовать метод расширения :

public static class DateTimeExtensions
{
    public static DateTime AddWeeks(this DateTime DT, int Weeks)
    {
        return DT.AddDays(Weeks * 7);
    }
}
0 голосов
/ 23 августа 2017

Я думаю, это потому, что существует несколько определений номеров недель, т. Е.

Определение ISO номера недели (https://en.wikipedia.org/wiki/ISO_week_date) отличается от определения номера недели в Северной Америке и в других культурах.

Почему приведенное выше объяснение имеет значение для нашего контекста (почему нет 'AddWeeks ()')

Начало 1-й недели или окончание 52/53 недели варьируется в зависимости от формата / культуры, поэтому при добавлении / вычитании, если мы пересекаем эту границу, то есть в начале года или в конце года, требуется дополнительная информация, чтобы определить точную дату заданный номер недели (вне зависимости от того, следуют ли они стандарту ISO или местной культуре, понедельник - день начала или воскресенье и т. д.), что делает эту функцию сложной. Я думаю, что по этой причине они оставили нам выяснить номер недели.

Если вам буквально нравится добавлять недели и если вас не волнует определение # недели, тогда да, предложенное выше решение Стивом Морганом достаточно умен.

0 голосов
/ 27 июля 2011

Если бы они были конкретны около 52 недель, то я бы использовал -7 * 52, поскольку в неделе всегда есть 7 дней.Использование .AddYear будет учитывать високосные годы, когда существует дополнительный день.

0 голосов
/ 27 июля 2011

То же самое, потому что неделя = 7 дней (.AddDays (-7 * 52) == .AddWeeks (-52))

, но 52 недели - это не год (.AddDays (-7 * 52)! = .AddYears (-1))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...