如何在NodaTime中将Interval转换为LocalDate范围?

时间:2016-10-20 05:44:14

标签: c# .net nodatime

  

我遇到了需要在NodaTime中将Interval值转换为LocalDate的Enumerable集合的场景。我怎么能这样做?

以下是代码

Interval invl = obj.Interval; 
//Here is the Interval value i.e.,{2016-10-20T00:00:00Z/2016-11-03T00:00:00Z}

如何在这些间隔之间形成日期范围?

提前致谢。

2 个答案:

答案 0 :(得分:4)

Niyoko给出的一种略有替代的方法:

  • Instant值转换为LocalDate
  • 在它们之间实施范围

我假设时间间隔是独占的 - 所以如果结束点在目标时区中表示完全午夜,则排除那一天,否则你将其包括在内。

因此,下面的方法包括在给定时区内的时间间隔内涵盖的每个日期。

public IEnumerable<LocalDate> DatesInInterval(Interval interval, DateTimeZone zone)
{
    LocalDate start = interval.Start.InZone(zone).Date;
    ZonedDateTime endZonedDateTime = interval.End.InZone(zone);
    LocalDate end = endLocalDateTime.Date;
    if (endLocalDateTime.TimeOfDay == LocalTime.Midnight)
    {
        end = end.PlusDays(-1);
    }
    for (LocalDate date = start; date <= end; date = date.PlusDays(1))
    {
        yield return date;
    }
}

答案 1 :(得分:2)

使用此代码:

var l = Enumerable.Range(0, int.MaxValue)
            .Select(x => Period.FromDays(x))
            .Select(x => LocalDate.Add(interval.Start.InZone(localZone).Date, x))
            .TakeWhile(x => x.CompareTo(interval.End.InZone(localZone).Date) <= 0);

示例:

var localZone = DateTimeZone.ForOffset(Offset.FromHours(7));

var start = Instant.FromDateTimeOffset(new DateTimeOffset(new DateTime(2016, 10, 1)));
var end = Instant.FromDateTimeOffset(new DateTimeOffset(new DateTime(2016, 10, 25)));

var interval = new Interval(start, end);

var l = Enumerable.Range(0, int.MaxValue)
        .Select(x => Period.FromDays(x))
        .Select(x => LocalDate.Add(interval.Start.InZone(localZone).Date, x))
        .TakeWhile(x => x.CompareTo(interval.End.InZone(localZone).Date) <= 0);

foreach (var localDate in l)
{
    Console.WriteLine(localDate);
}