Генерация еженедельных дат - PullRequest
2 голосов
/ 26 февраля 2012

Я уверен, что это было сделано раньше, поэтому я ищу эффективное решение, а не собственное решение.

Учитывая 2 даты, я пытаюсь создать точную еженедельную дату (для создания еженедельных заказов).

РЕДАКТИРОВАТЬ: Мне нужно использовать стандартную библиотеку .NET для этого.

Example below,

Given 28/02/2012 and 6/03/2012.

so, the weekly dates generated are
- Week From(Start Monday):   Week To(End Sunday):
- 27/02/2012               - 04/03/2012
- 05/03/2012               - 11/03/2012

Another example (1 month)

Given 01/02/2012 and 29/02/2012
so, the weekly dates generated are
- Week From(Start Monday):   Week To(End Sunday):
- 30/01/2012               - 05/02/2012
- 06/02/2012               - 12/02/2012
- 13/02/2012               - 19/02/2012
- 20/02/2012               - 26/02/2012
- 27/02/2012               - 04/03/2012

Я делаю это в c #. Это было сделано раньше? Разум делиться решениями?

Приветствия

Ответы [ 3 ]

7 голосов
/ 26 февраля 2012

Вот решение с использованием Noda Time .По общему признанию это требует оператора <=, который я только сейчас реализую - но это не должно занять много времени:)

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        ShowDates(new LocalDate(2012, 2, 28), new LocalDate(2012, 3, 6));
        ShowDates(new LocalDate(2012, 2, 1), new LocalDate(2012, 2, 29));
    }

    static void ShowDates(LocalDate start, LocalDate end)
    {
        // Previous is always strict - increment start so that
        // it *can* be the first day, then find the previous
        // Monday
        var current = start.PlusDays(1).Previous(IsoDayOfWeek.Monday);
        while (current <= end)
        {
            Console.WriteLine("{0} - {1}", current,
                              current.Next(IsoDayOfWeek.Sunday));
            current = current.PlusWeeks(1);
        }
    }
}

Очевидно, что это можно сделать и в обычном DateTime, нонет реального представления «просто даты», которая делает код менее понятным - и вам нужно реализовать Previous самостоятельно.

РЕДАКТИРОВАТЬ: Например, в этом случае вы можете использовать:

using System;

class Test
{
    static void Main()
    {
        ShowDates(new DateTime(2012, 2, 28), new DateTime(2012, 3, 6));
        ShowDates(new DateTime(2012, 2, 1), new DateTime(2012, 2, 29));
    }

    static void ShowDates(DateTime start, DateTime end)
    {
        // In DateTime, 0=Sunday
        var daysToSubtract = ((int) start.DayOfWeek + 6) % 7;
        var current = start.AddDays(-daysToSubtract);        

        while (current <= end)
        {
            Console.WriteLine("{0} - {1}", current, current.AddDays(6));
            current = current.AddDays(7);
        }
    }
}
0 голосов
/ 26 февраля 2012

Это решение позволяет настроить начало и конец DayOfWeek:

Решение:

public Dictionary<DateTime, DateTime> GetWeeklyDateTimes(DateTime from, DateTime to, DayOfWeek startDay, DayOfWeek endDay)
    {
        int startEndSpan = 7 - endDay - startDay;

        // Subtract days until it falls on our desired start day
        from = from.AddDays(startDay - from.DayOfWeek);
        // Add days until it falls on our desired end day
        to = to.AddDays(to.DayOfWeek - endDay + 2);

        Dictionary<DateTime, DateTime> dateTimes = new Dictionary<DateTime, DateTime>();

        while (to.Subtract(from).Days > startEndSpan)
        {
            dateTimes.Add(from, from.AddDays(startEndSpan));

            from = from.AddDays(startEndSpan + 1);
        }

        return dateTimes;
    }

Пример использования:

// DateTime(2012, 2, 1) corresponds to Year 2012, Month February, Day 1
Dictionary<DateTime, DateTime> dateTimes = GetWeeklyDateTimes(new DateTime(2012, 2, 1), new DateTime(2012, 2, 29), DayOfWeek.Monday, DayOfWeek.Sunday);

foreach (KeyValuePair<DateTime, DateTime> entry in dateTimes)
{
    Trace.WriteLine(entry.Key.ToString() + "     " + entry.Value.ToString());
}
0 голосов
/ 26 февраля 2012

При условии, что вам не нужно выяснять, что дата начала - понедельник:

var slots = new List<Tuple<DateTime, DateTime>>();
DateTime start = new DateTime(2012, 2, 28);
DateTime end = new DateTime(2012, 3, 6);
for (DateTime i = start; i < end; i = i.AddDays(7))
{
    slots.Add(new Tuple<DateTime, DateTime>(i, i.AddDays(6)));
}

foreach (var slot in slots)
{
    Console.WriteLine("{0}\t{1}", slot.Item1.ToString("dd/MM/yyyy"), slot.Item2.ToString("dd/MM/yyyy"));
}

Редактировать: Предполагая, что вам нужно выяснить, какой понедельник и какое воскресенье охватывает диапазон дат, вы можете двигаться на один день назад, пока не наступит понедельник, и на день вперед, пока вы не достигнете воскресенья.

class Program
{
    static void Main(string[] args)
    {
        var slots = new List<Tuple<DateTime, DateTime>>();
        DateTime start = FirstMonday(new DateTime(2012, 2, 28));
        DateTime end = FirstSunday(new DateTime(2012, 3, 6));
        for (DateTime i = start; i < end; i = i.AddDays(7))
        {
            slots.Add(new Tuple<DateTime, DateTime>(i, i.AddDays(6)));
        }

        foreach (var slot in slots)
        {
            Console.WriteLine("{0}\t{1}", slot.Item1.ToString("dd/MM/yyyy"), slot.Item2.ToString("dd/MM/yyyy"));
        }

        Console.ReadLine();
    }

    static DateTime FirstMonday(DateTime date)
    {
        while (date.DayOfWeek != DayOfWeek.Monday) date = date.AddDays(-1);
        return date;
    }
    static DateTime FirstSunday(DateTime date)
    {
        while (date.DayOfWeek != DayOfWeek.Sunday) date = date.AddDays(1);
        return date;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...