1

次の日時があります。

Start = 15/12/2012 13:00:00
End   = 16/02/2013 14:00:00

それを毎月3回に分けるにはどうすればいいですか?

- 15-12-2012 13:00:00 -> 01-01-2013 00:00:00
- 01-01-2013 00:00:00 -> 01-02-2013 00:00:00
- 01-02-2013 00:00:00 -> 16-02-2013 14:00:00

合計タイムスパンは同じままである必要があります。これは LINQ で簡単に実行できますか?

4

2 に答える 2

7

確かに、これを試してください(小さなヘルパークラスが含まれています)

プロセス:

var Start = DateTime.Parse("15 Dec 2012 13:00:00");
var End = DateTime.Parse("16 Feb 2013 14:00:00");

var runningDate = Start;
while (runningDate < End)
{
    var nextMonthSeed = runningDate.AddMonths(1);
    var to = DateHelper.Min(new DateTime(nextMonthSeed.Year, nextMonthSeed.Month, 1), End);
    Console.WriteLine("{0} -> {1}", runningDate.ToString("dd-MM-yyyy HH:mm:ss"), to.ToString("dd-MM-yyyy HH:mm:ss"));
    runningDate = to;
}

ヘルパー クラス:

public static class DateHelper
{
    public static DateTime Min(DateTime date1, DateTime date2)
    {
        return (date1 < date2 ? date1 : date2);
    }
}
于 2013-02-26T10:14:00.277 に答える
1

これらの拡張メソッドのようなものを試すことができます:

public static class SomeExtensions {

    public static IEnumerable<Tuple<DateTime, DateTime>> GetIntervals(
        this DateTime from, 
        DateTime to) {

        var currentFrom = from;
        var currentTo = from.AdvanceToStartOfNextMonth();

        while (currentTo < to) {
            yield return Tuple.Create(currentFrom, currentTo);
            currentFrom = currentTo;
            currentTo = currentFrom.AdvanceToStartOfNextMonth();
        }

        yield return Tuple.Create(currentFrom, to);
    }

    public static DateTime AdvanceToStartOfNextMonth(this DateTime @this) {
        var newMonth = @this.Month + 1;
        var newYear = @this.Year;
        if (newMonth == 13) {
            newMonth = 1;
            newYear++;
        }
        return new DateTime(newYear, newMonth, 1);
    }
}

そして、次のように使用します。

public class Etc {

    public static void Foo() {
        DateTime start = ... 
        DateTime stop = ....

        Tuple<DateTime, DateTime>[] intervals = start.GetIntervals(stop).ToArray();

        // or simply
        foreach (var interval in start.GetIntervals(stop)) 
            Console.WriteLine(interval);
    }

}

編集

そして、ここに私が試した小さなテストがあります(そして、大丈夫だと思います):

class Program {
    static void Main(string[] args) {

        DateTime start = DateTime.Now.Subtract(TimeSpan.FromDays(170));
        DateTime stop = DateTime.Now;

        foreach (var interval in start.GetIntervals(stop))
            Console.WriteLine(interval);

        Console.ReadKey(intercept: true);

    }
}

そして、これらの結果が生成されました(コンソールアプリで):

ここに画像の説明を入力

編集の終わり

于 2013-02-26T10:10:19.620 に答える