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