2016-10-20 3 views
1

Я столкнулся с сценарием, где мне нужно преобразовать значение Interval в Перечислимую коллекцию LocalDate в NodaTime. Как я могу это сделать?Как преобразовать интервал в диапазон LocalDate в NodaTime?

Ниже приведен код

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

Как я могу сформировать диапазон дат между этими интервалами?

Заранее спасибо.

ответ

3

Немного альтернативный подход к одной заданной Niyoko:

  • Преобразовать оба Instant значения в LocalDate
  • Внедрение диапазона betw ееп их

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

Таким образом, метод, приведенный ниже, включает в себя каждую дату, которая покрыта интервалом в данном часовом поясе.

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; 
    } 
} 
+0

Спасибо. Я попробую с вашим решением. Кроме того, я получаю сообщение об ошибке «Невозможно неявно преобразовать тип« NodaTime.ZonedDateTime »в« NodaTime.LocalDateTime ». Преобразование 'LocalDateTime' в' ZonedDateTime' разрешило ошибку. Правильно ли я это делаю? – Karthik

+0

@ Karthik: Yup - исправил образец сейчас, спасибо. –

+0

Спасибо @ Jon Skeet. – Karthik

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); 
} 
+0

Спасибо. Ваше решение отлично работает. Но можете ли вы объяснить объект DateTimeZone 'localZone' ?, поскольку он устанавливает значение смещения. – Karthik

+0

@Karthik Используется для преобразования 'Instant' в' LocalDate', потому что 'Instant' является часовым-агностиком. Измените его в соответствии с вашим местным часовым поясом. –

+0

Или вы можете автоматически получить местный часовой пояс, вызывая 'DateTimeZoneProviders.Bcl.GetSystemDefault()' –

 Смежные вопросы

  • Нет связанных вопросов^_^