Как точно представить диапазон дат в NodaTime?

Цели

У меня есть список элементов LocalDate, представляющих наборы дат начала и окончания.

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

Вопросы

  • Предоставляет ли NodaTime какую-то конструкцию DateRange, которую я пропустил в документации?
  • Я думаю об этом неправильно? Есть ли более естественный/предпочтительный способ сделать это, который уже позволяет NodaTime?
  • Не навлеку ли я на себя неприятности, пытаясь обдумать диапазон дат, используя LocalDate в качестве даты начала и окончания?

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

Обновление: я заметил похожий вопрос в предмет из 2009 года, но, похоже, он относится к другому классу коммунальных услуг; Я предполагаю, что с тех пор NodaTime, возможно, эволюционировал, чтобы приспособиться к этой ситуации.


person SeanKilleen    schedule 15.12.2013    source источник
comment
Похоже, это открытый запрос функции: code.google.com. /p/noda-time/issues/detail?id=2   -  person Mike Zboray    schedule 16.12.2013


Ответы (1)


Noda Time предоставляет тип Interval для диапазона значений Instant, но не предоставляет типы диапазона для других типов. Одной из причин этого является нюанс того, как диапазоны используются для разных типов.

Если я даю вам диапазон мгновений, он всегда рассматривается как полуоткрытый интервал. Начальное значение включено, но конечное значение исключено. Люди делают это естественным образом каждый раз, когда мы указываем значение времени, например, когда я говорю, что событие проходит с 1:00 до 2:00, очевидно, я имею в виду, что событие заканчивается в 2:00, поэтому 2:00 — это не входит.

Но при использовании целых диапазонов календарных дат даты окончания обычно включительны. Чтобы представить весь январь (в виде диапазона LocalDate значений), я бы, вероятно, сказал, что с 1 января по 31 января, и я включаю последний день целиком.

Вероятно, мы могли бы добавить некоторые дополнительные типы диапазонов, чтобы реализовать эти вещи, но нам нужно подумать о том, насколько ценно иметь их в API, когда вы, вероятно, могли бы просто создавать их по мере необходимости. Я не говорю, что я за или против этого, но это, вероятно, то, что нужно обсудить в группе пользователей Noda Time. .

Чтобы ответить на ваши конкретные вопросы:

  • Нет, для местных дат нет предопределенного класса диапазона.
  • Единственное, что следует учитывать, это то, что математика календаря обычно выполняется с помощью класса Period. Например, чтобы определить, сколько дней проходит между двумя календарными датами:

    LocalDate ld1 = new LocalDate(2012, 1, 1);
    LocalDate ld2 = new LocalDate(2013, 12, 25);
    Period period = Period.Between(ld1, ld2, PeriodUnits.Days);
    long days = period.Days;
    
  • Нет, нет ничего плохого в создании диапазона локальных дат, просто может быть не так много преимуществ. С тем же успехом вы можете иметь два свойства, StartDate и EndDate, в ваших собственных классах. Просто будьте осторожны с инклюзивностью конечных дат, а не с эксклюзивностью, которую вы увидите с интервалом или диапазоном времени.

И, наконец, вы сказали:

... чтобы я мог выполнять над ними операции как над набором перекрывающихся или отдельных диапазонов и т. д.

Вы, вероятно, ищете такие операции, как пересечение, объединение, вычисление промежутков, сортировка и т. д. Эти и другие операции определяются в Библиотека периодов времени, но в настоящее время в Noda Time нет ничего подобного. Если кто-то должен был создать его, он, вероятно, должен быть в сопутствующей библиотеке (возможно, NodaTime.Ranges?). Наверно не хотелось бы тянуть его в ядро, но мало ли...

Если вы в конечном итоге используете эту библиотеку периодов времени, убедитесь, что вы понимаете, что она работает только с DateTime и совершенно не обращает внимания на DateTimeKind. Поэтому, чтобы быть продуктивным с ним, вам, вероятно, следует убедиться, что вы работаете только со значениями UTC или «неуказанными» календарными датами, и постараться не спрашивать его о таких вещах, как «сколько часов в сутках», потому что он получит это неправильно для дней с переходом на летнее время.

person Matt Johnson-Pint    schedule 15.12.2013
comment
Спасибо за этот отличный, информативный ответ. Вы заранее ответили на мой вопрос, теорию, стоящую за ним, и на любые мои дополнительные вопросы. Очень признателен! - person SeanKilleen; 16.12.2013
comment
Возможно, это следует обновить теперь, когда NodaTime включает DateInterval? (nodatime.org/2.3.x/api/NodaTime.DateInterval.html) - person Daniel García Rubio; 18.07.2018
comment
@ Даниэль Да. Скоро сделаю. Спасибо! - person Matt Johnson-Pint; 18.07.2018