Вычислить неделю понедельника-воскресенья из объекта DateTime - PullRequest
1 голос
/ 29 августа 2011

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

Он рассчитывает начальную дату нормально, но проблема начинается, когда он попадает в последний цикл. При каждом запуске через переменную DateTime значение tmpDate должно увеличиваться на 1 день, а затем добавляться в список. Однако в настоящее время я получаю список, содержащий 7 дат начала.

Может кто-нибудь увидеть, где я иду не так (у меня такое ощущение, что я могу выглядеть как простак по этому поводу :))?
Кроме того, извинения, если это часто задаваемый вопрос. Может видеть много вопросов о дате начала / дате окончания и типе номера недели, но ни один из них конкретно не касается этого типа проблемы.

private List<DateTime> getWeek(DateTime enteredDate)
{ 
    /* Create List to hold the dates */
    List<DateTime> week = new List<DateTime>();
    int enteredDatePosition = (int)enteredDate.DayOfWeek;

    /* Determine first day of the week */
    int difference = 0;

    for (int i = 0; i < 7; i++)
    {
        difference++;
        if (i == enteredDatePosition)
        {
            break;
        }
    }
    // 2 subtracted from difference so first and enteredDatePostion elements will not be counted. 
    difference -= 2;

    DateTime startDate = enteredDate.Subtract(new TimeSpan(difference, 0, 0, 0));
    week.Add(startDate);

    /* Loop through length of a week, incrementing date & adding to list with each iteration */
    DateTime tmpDate = startDate;

    for (int i = 1; i < 7; i++)
    {
        tmpDate.Add(new TimeSpan(1, 0, 0, 0));
        week.Add(tmpDate);
    }
    return week;
}

Ответы [ 3 ]

4 голосов
/ 29 августа 2011

DateTime s являются неизменяемыми.
tmpDate.Add(...) возвращает новый DateTime и не изменяет tmpDate.

Вы должны написать tmpDate = tmpDate.AddDays(1) или tmpDate += TimeSpan.FromDays(1)

1 голос
/ 29 августа 2011

Вы делаете свой алгоритм более сложным, чем он должен быть. Посмотрите этот рабочий фрагмент:

using System;
using System.Collections.Generic;

public class MyClass
{
    public static void Main()
    {
        // client code with semi-arbitrary DateTime suuplied
        List<DateTime> week = GetWeek(DateTime.Today.AddDays(-2));
        foreach (DateTime dt in week) Console.WriteLine(dt);
    }

    public static List<DateTime> GetWeek(DateTime initDt)
    {
        // walk back from supplied date until we get Monday and make 
        // that the initial day
        while (initDt.DayOfWeek != DayOfWeek.Monday) 
            initDt = initDt.AddDays(-1.0);

        List<DateTime> week = new List<DateTime>();

        // now enter the initial day into the collection and increment
        // and repeat seven total times to get the full week
        for (int i=0; i<7; i++)
        { 
            week.Add(initDt);
            initDt = initDt.AddDays(1.0);
        }

        return week;
    }
}
1 голос
/ 29 августа 2011

Я считаю, что этот фрагмент предназначен для воскресенья и субботы, но вы можете попробовать что-то вроде этого:

DateTime ToDate = DateTime.Now.AddDays((6 - (int)DateTime.Now.DayOfWeek) - 7);
DateTime FromDate = ToDate.AddDays(-6);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...