Spec-Zone.ru › D

std.datetime.interval

Категория Функции
Основные типы Interval Direction
Специальные интервалы everyDayOfWeek everyMonth everyDuration
Специальные интервалы NegInfInterval PosInfInterval
Базовые диапазоны IntervalRange NegInfIntervalRange PosInfIntervalRange
Флаги PopFirst

Лицензия:
Boost License 1.0.
Авторы:
Jonathan M Davis
Исходный код
std/datetime/interval.d
enum Direction: int;

Указывает направление во времени. Пример использования — функция Interval's expand, которая использует её для указания, следует ли расширять интервал назад (в прошлое), вперёд (в будущее) или в обе стороны.

bwd

Назад.

fwd

Вперёд.

both

В обе стороны.

alias PopFirst = std.typecons.Flag!"popFirst".Flag;

Используется для указания, нужно ли вызывать popFront сразу после создания диапазона. Идея в том, что для некоторых функций, используемых для генерации диапазона для интервала, front не обязательно является временной точкой, которая когда-либо будет сгенерирована диапазоном (например, если диапазон — это каждое воскресенье в пределах интервала, но интервал начался в понедельник), поэтому необходим способ обработки этого. Чтобы получить первую временную точку в диапазоне, соответствующую тому, что генерирует функция, используйте PopFirst.yes для указания, что диапазон должен иметь popFront вызываемый для него до возвращения диапазона, так что front является временной точкой, которую генерирует функция. Чтобы не соответствовать первой временной точке функции-генератору, используйте PopFront.no.

Например, если функция, используемая для генерации диапазона временных точек, генерирует последовательные Пасхи (т. е. вы перебираете все Пасхи в интервале), начальная дата, вероятно, не является Пасхой. Использование PopFirst.yes сообщит функции, возвращающей диапазон, что popFront должен быть вызван, чтобы front стала Пасхой — следующей, сгенерированной функцией (в случае итерации вперёд будет Пасха, следующая за исходной front, в то время как при итерации назад это будет Пасха, предшествующая исходной front). Если используется PopFirst.no, front останется исходной временной точкой и она не обязательно будет временной точкой, сгенерированной функцией генерации диапазона (что в большинстве случаев и есть желаемое — например, если вы перебираете каждый день, начиная с начала интервала).

Если установлено значение PopFirst.no, то popFront не вызывается перед возвращением диапазона.

В противном случае, если установлено значение PopFirst.yes, то popFront вызывается перед возвращением диапазона.

struct Interval(TP);

Представляет интервал времени.

У Interval есть начальная и конечная точки. Интервал времени — это, следовательно, время, начиная с начальной точки и до, но не включая, конечной точки. Например:

[5 января 2010 — 10 марта 2010)
[05:00:30 — 12:00:00)
[04.01.1982 08:59:00 — 04.07.2010 12:00:00)


Из Interval можно получить диапазон, позволяющий перебирать этот интервал, причем точные временные точки, по которым производится итерация, зависят от функции, которая генерирует этот диапазон.

pure this(U)(scope const TP begin, scope const U end)
Constraints: if (is(immutable(TP) == immutable(U)));
Параметры:
TP begin Точка времени, с которой начинается интервал.
U end Точка времени, которая заканчивает (но не включается в) интервал.
Исключения:
std.datetime.date.DateTimeException, если end предшествует begin.
Пример
Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));
pure this(D)(scope const TP begin, scope const D duration)
Constraints: if (__traits(compiles, begin + duration));
Параметры:
TP begin Точка времени, с которой начинается интервал.
D duration Продолжительность от начальной точки до конечной точки.
Исключения:
std.datetime.date.DateTimeException, если результирующий end предшествует begin.
Пример
assert(Interval!Date(Date(1996, 1, 2), dur!"days"(3)) ==
       Interval!Date(Date(1996, 1, 2), Date(1996, 1, 5)));
pure nothrow ref Interval opAssign(ref const Interval rhs);
Параметры:
Interval rhs Интервал, который нужно назначить этому интервалу.
pure nothrow ref Interval opAssign(Interval rhs);
Параметры:
Interval rhs Интервал, который нужно назначить этому интервалу.
const pure nothrow @property TP begin();

Начальная точка интервала. Она включается в интервал.

Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).begin ==
       Date(1996, 1, 2));
pure @property void begin(TP timePoint);

Начальная точка интервала. Она включается в интервал.

Параметры:
TP timePoint Точка времени, на которую нужно установить начало.
Исключения:
std.datetime.date.DateTimeException, если полученный интервал будет недопустимым.
const pure nothrow @property TP end();

Конечная точка интервала. Она исключается из интервала.

Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).end ==
       Date(2012, 3, 1));
pure @property void end(TP timePoint);

Конечная точка интервала. Она исключается из интервала.

Параметры:
TP timePoint Точка времени, на которую нужно установить конец.
Исключения:
std.datetime.date.DateTimeException, если полученный интервал будет недопустимым.
const pure nothrow @property auto length();

Возвращает продолжительность между begin и end.

Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).length ==
       dur!"days"(5903));
const pure nothrow @property bool empty();

Является ли длина интервала 0, то есть, является ли интервал пустым.

Пример
assert(Interval!Date(Date(1996, 1, 2), Date(1996, 1, 2)).empty);
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).empty);
const pure bool contains(scope const TP timePoint);

Включает ли данный интервал заданную точку времени.

Параметры:
TP timePoint Точка времени, для проверки принадлежности интервалу.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            Date(1994, 12, 24)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            Date(2000, 1, 5)));
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            Date(2012, 3, 1)));
const pure bool contains(scope const Interval interval);

Включает ли данный интервал заданный интервал полностью.

Параметры:
Interval interval Интервал для проверки принадлежности интервалу.
Исключения:
std.datetime.date.DateTimeException, если любой из интервалов пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            Interval!Date(Date(1998, 2, 28), Date(2013, 5, 1))));
const pure bool contains(scope const PosInfInterval!TP interval);

Включает ли данный интервал заданный интервал полностью.

Всегда возвращает false (если интервал не пуст), т.к. интервал, идущий до положительной бесконечности, никогда не может быть полностью включен в конечный интервал.

Параметры:
PosInfInterval!TP interval Интервал для проверки принадлежности интервалу.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            PosInfInterval!Date(Date(1999, 5, 4))));
const pure bool contains(scope const NegInfInterval!TP interval);

Включает ли данный интервал заданный интервал полностью.

Всегда возвращает false (если интервал не пуст), т.к. интервал, начинающийся с отрицательной бесконечности, никогда не может быть полностью включен в конечный интервал.

Параметры:
NegInfInterval!TP interval Интервал для проверки принадлежности интервалу.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            NegInfInterval!Date(Date(1996, 5, 4))));
const pure bool isBefore(scope const TP timePoint);

Находится ли данный интервал перед заданной точкой времени.

Параметры:
TP timePoint Точка времени, для проверки, находится ли данный интервал перед ней.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            Date(1994, 12, 24)));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            Date(2000, 1, 5)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            Date(2012, 3, 1)));
const pure bool isBefore(scope const Interval interval);

Находится ли данный интервал перед заданным интервалом и не пересекается ли с ним.

Параметры:
Interval interval Интервал для проверки.
Исключения:
std.datetime.date.DateTimeException, если любой из интервалов пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            Interval!Date(Date(2012, 3, 1), Date(2013, 5, 1))));
const pure bool isBefore(scope const PosInfInterval!TP interval);

Находится ли данный интервал перед заданным интервалом и не пересекается ли с ним.

Параметры:
PosInfInterval!TP interval Интервал для проверки.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            PosInfInterval!Date(Date(2013, 3, 7))));
const pure bool isBefore(scope const NegInfInterval!TP interval);

Находится ли данный интервал перед заданным интервалом и не пересекается ли с ним.

Всегда возвращает false (если интервал не пуст), т.к. конечный интервал никогда не может предшествовать интервалу, начинающемуся с отрицательной бесконечности.

Параметры:
NegInfInterval!TP interval Интервал для проверки.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isBefore(
            NegInfInterval!Date(Date(1996, 5, 4))));
const pure bool isAfter(scope const TP timePoint);

Находится ли данный интервал после заданной точки времени.

Параметры:
TP timePoint Точка времени, для проверки, находится ли данный интервал после неё.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            Date(1994, 12, 24)));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            Date(2000, 1, 5)));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            Date(2012, 3, 1)));
const pure bool isAfter(scope const Interval interval);

Находится ли данный интервал после заданного интервала и не пересекается ли с ним.

Параметры:
Interval interval Интервал для проверки.
Исключения:
std.datetime.date.DateTimeException, если любой из интервалов пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            Interval!Date(Date(1989, 3, 1), Date(1996, 1, 2))));
const pure bool isAfter(scope const PosInfInterval!TP interval);

Находится ли данный интервал после заданного интервала и не пересекается ли с ним.

Всегда возвращает false (если интервал не пуст), т.к. конечный интервал никогда не может быть после интервала, идущего до положительной бесконечности.

Параметры:
PosInfInterval!TP interval Интервал для проверки.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            PosInfInterval!Date(Date(1999, 5, 4))));
const pure bool isAfter(scope const NegInfInterval!TP interval);

Является ли этот интервал после данного интервала и не пересекается ли с ним.

Параметры:
NegInfInterval!TP interval Интервал для проверки по отношению к этому интервалу.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
            NegInfInterval!Date(Date(1996, 1, 2))));
const pure bool intersects(scope const Interval interval);

Пересекается ли данный интервал с этим интервалом.

Параметры:
Interval interval Интервал, проверяемый на пересечение с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если какой-либо интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            Interval!Date(Date(1989, 3, 1), Date(1996, 1, 2))));
const pure bool intersects(scope const PosInfInterval!TP interval);

Пересекается ли данный интервал с этим интервалом.

Параметры:
PosInfInterval!TP interval Интервал, проверяемый на пересечение с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            PosInfInterval!Date(Date(2012, 3, 1))));
const pure bool intersects(scope const NegInfInterval!TP interval);

Пересекается ли данный интервал с этим интервалом.

Параметры:
NegInfInterval!TP interval Интервал, проверяемый на пересечение с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            NegInfInterval!Date(Date(1996, 1, 2))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
            NegInfInterval!Date(Date(2000, 1, 2))));
const Interval intersection(scope const Interval interval);

Возвращает пересечение двух интервалов

Параметры:
Interval interval Интервал для пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если интервалы не пересекаются или если какой-либо интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2000, 8, 2)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))) ==
       Interval!Date(Date(1999, 1 , 12), Date(2011, 9, 17)));
const Interval intersection(scope const PosInfInterval!TP interval);

Возвращает пересечение двух интервалов

Параметры:
PosInfInterval!TP interval Интервал для пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если интервалы не пересекаются или если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2012, 3, 1)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
            PosInfInterval!Date(Date(1999, 1, 12))) ==
       Interval!Date(Date(1999, 1 , 12), Date(2012, 3, 1)));
const Interval intersection(scope const NegInfInterval!TP interval);

Возвращает пересечение двух интервалов

Параметры:
NegInfInterval!TP interval Интервал для пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если интервалы не пересекаются или если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
            NegInfInterval!Date(Date(1999, 7, 6))) ==
       Interval!Date(Date(1996, 1 , 2), Date(1999, 7, 6)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2012, 3, 1)));
const pure bool isAdjacent(scope const Interval interval);

Является ли данный интервал смежным с этим интервалом.

Параметры:
Interval interval Интервал, проверяемый на смежность с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если какой-либо интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(1990, 7, 6), Date(1996, 1, 2))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(2012, 3, 1), Date(2013, 9, 17))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(1989, 3, 1), Date(2012, 3, 1))));
const pure bool isAdjacent(scope const PosInfInterval!TP interval);

Является ли данный интервал смежным с этим интервалом.

Параметры:
PosInfInterval!TP interval Интервал, проверяемый на смежность с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            PosInfInterval!Date(Date(2012, 3, 1))));
const pure bool isAdjacent(scope const NegInfInterval!TP interval);

Является ли данный интервал смежным с этим интервалом.

Параметры:
NegInfInterval!TP interval Интервал, проверяемый на смежность с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            NegInfInterval!Date(Date(1996, 1, 2))));

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
            NegInfInterval!Date(Date(2000, 1, 2))));
const Interval merge(scope const Interval interval);

Возвращает объединение двух интервалов

Параметры:
Interval interval Интервал для объединения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если интервалы не пересекаются и не являются смежными, или если какой-либо интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).merge(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       Interval!Date(Date(1990, 7 , 6), Date(2012, 3, 1)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).merge(
            Interval!Date(Date(2012, 3, 1), Date(2013, 5, 7))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2013, 5, 7)));
const PosInfInterval!TP merge(scope const PosInfInterval!TP interval);

Возвращает объединение двух интервалов

Параметры:
PosInfInterval!TP interval Интервал для объединения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если интервалы не пересекаются и не являются смежными, или если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).merge(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       PosInfInterval!Date(Date(1990, 7 , 6)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).merge(
            PosInfInterval!Date(Date(2012, 3, 1))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));
const NegInfInterval!TP merge(scope const NegInfInterval!TP interval);

Возвращает объединение двух интервалов

Параметры:
NegInfInterval!TP interval Интервал для объединения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если интервалы не пересекаются и не являются смежными, или если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).merge(
            NegInfInterval!Date(Date(1996, 1, 2))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).merge(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       NegInfInterval!Date(Date(2013, 1 , 12)));
const pure Interval span(scope const Interval interval);

Возвращает интервал, охватывающий с самого раннего момента времени двух интервалов до (но не включая) самого позднего момента времени двух интервалов.

Параметры:
Interval interval Интервал для создания диапазона вместе с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если какой-либо интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
            Interval!Date(Date(1990, 7, 6), Date(1991, 1, 8))) ==
       Interval!Date(Date(1990, 7 , 6), Date(2012, 3, 1)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
            Interval!Date(Date(2012, 3, 1), Date(2013, 5, 7))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2013, 5, 7)));
const pure PosInfInterval!TP span(scope const PosInfInterval!TP interval);

Возвращает интервал, охватывающий с самого раннего момента времени двух интервалов до (но не включая) самого позднего момента времени двух интервалов.

Параметры:
PosInfInterval!TP interval Интервал для создания диапазона вместе с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       PosInfInterval!Date(Date(1990, 7 , 6)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
            PosInfInterval!Date(Date(2050, 1, 1))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));
const pure NegInfInterval!TP span(scope const NegInfInterval!TP interval);

Возвращает интервал, охватывающий с самого раннего момента времени двух интервалов до (но не включая) самого позднего момента времени двух интервалов.

Параметры:
NegInfInterval!TP interval Интервал для создания диапазона вместе с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст.
Пример
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
            NegInfInterval!Date(Date(1602, 5, 21))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));

assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       NegInfInterval!Date(Date(2013, 1 , 12)));
pure void shift(D)(D duration)
Constraints: if (__traits(compiles, begin + duration));

Перемещает интервал вперёд или назад во времени на заданную длительность (положительная длительность перемещает интервал вперёд; отрицательная — назад). Эффективно, это begin += duration и end += duration.

Параметры:
D duration Длительность сдвига интервала.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пуст или если полученный интервал будет недопустимым.
Пример
auto interval1 = Interval!Date(Date(1996, 1, 2), Date(2012, 4, 5));
auto interval2 = Interval!Date(Date(1996, 1, 2), Date(2012, 4, 5));

interval1.shift(dur!"days"(50));
assert(interval1 == Interval!Date(Date(1996, 2, 21), Date(2012, 5, 25)));

interval2.shift(dur!"days"(-50));
assert(interval2 == Interval!Date(Date(1995, 11, 13), Date(2012, 2, 15)));
void shift(T)(T years, T months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes)
Constraints: if (isIntegral!T);

Перемещает интервал вперёд или назад во времени на указанное количество лет и/или месяцев (положительное число лет и месяцев сдвигает интервал вперёд, отрицательное — назад). Добавляет указанные годы и месяцы к началу и концу интервала. Эффективно вызывает add!"years"() и затем add!"months"() для начала и конца с указанным числом лет и месяцев.

Параметры:
T years Количество лет для сдвига интервала.
T months Количество месяцев для сдвига интервала.
AllowDayOverflow allowOverflow Допускать ли переполнение дней в begin и end, что вызовет увеличение месяца.
Исключения:
std.datetime.date.DateTimeException, если интервал пустой или результирующий интервал будет некорректным.
Пример
auto interval1 = Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));
auto interval2 = Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));

interval1.shift(2);
assert(interval1 == Interval!Date(Date(1998, 1, 2), Date(2014, 3, 1)));

interval2.shift(-2);
assert(interval2 == Interval!Date(Date(1994, 1, 2), Date(2010, 3, 1)));
pure void expand(D)(D duration, Direction dir = Direction.both)
Constraints: if (__traits(compiles, begin + duration));

Расширяет интервал вперёд и/или назад во времени. Эффективно выполняет begin -= duration и/или end += duration. Направление расширения вперёд/назад определяется параметром dir.

Параметры:
D duration Длительность расширения интервала.
Direction dir Направление расширения интервала во времени.
Исключения:
std.datetime.date.DateTimeException, если интервал пустой или результирующий интервал будет некорректным.
Пример
auto interval1 = Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));
auto interval2 = Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));

interval1.expand(2);
assert(interval1 == Interval!Date(Date(1994, 1, 2), Date(2014, 3, 1)));

interval2.expand(-2);
assert(interval2 == Interval!Date(Date(1998, 1, 2), Date(2010, 3, 1)));
void expand(T)(T years, T months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes, Direction dir = Direction.both)
Constraints: if (isIntegral!T);

Расширяет интервал вперёд и/или назад во времени. Эффективно вычитает заданное количество месяцев/лет из begin и добавляет их к end. Направление расширения вперёд/назад определяется параметром dir.

Параметры:
T years Количество лет для расширения интервала.
T months Количество месяцев для расширения интервала.
AllowDayOverflow allowOverflow Допускать ли переполнение дней в begin и end, что вызовет увеличение месяца.
Direction dir Направление расширения интервала во времени.
Исключения:
std.datetime.date.DateTimeException, если интервал пустой или результирующий интервал будет некорректным.
Пример
auto interval1 = Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));
auto interval2 = Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));

interval1.expand(2);
assert(interval1 == Interval!Date(Date(1994, 1, 2), Date(2014, 3, 1)));

interval2.expand(-2);
assert(interval2 == Interval!Date(Date(1998, 1, 2), Date(2010, 3, 1)));
const IntervalRange!(TP, Direction.fwd) fwdRange(TP delegate(scope const TP) func, PopFirst popFirst = PopFirst.no);

Возвращает диапазон, который итерирует вперёд по интервалу, начиная с begin, используя func для генерации каждой последующей точки времени.

Начало диапазона — front интервала. func используется для генерации следующей front при вызове popFront. Если popFirst — PopFirst.yes, то popFront вызывается перед возвратом диапазона (чтобы front была точкой времени, которую func сгенерировал бы).

Если func когда-либо сгенерирует точку времени, меньшую или равную текущей front диапазона, будет выброшено исключение std.datetime.date.DateTimeException. Диапазон будет пустым и итерация завершится, когда func сгенерирует точку времени, равную или превосходящую end интервала.

В этом модуле есть вспомогательные функции для генерации общих делегатов для передачи в fwdRange. Их документация начинается с «Функция генерации диапазона», что облегчает поиск.

Параметры:
TP delegate(scope const TP) func Функция, используемая для генерации точек времени диапазона по интервалу.
PopFirst popFirst Вызывать ли popFront в диапазоне перед возвратом.
Исключения:
std.datetime.date.DateTimeException, если интервал пустой.
Предупреждение
func должна быть логически чистой. В идеале func должна быть указателем на функцию, но принудительное требование func быть чистой слишком ограничительно, а для удобства использования функций, генерирующих функции для передачи в fwdRange, func должна быть делегатом.
Если func сохраняет состояние, которое меняется при вызове, то некоторые алгоритмы могут работать неправильно, потому что диапазон save не сохранил состояние диапазона. Чтобы избежать таких ошибок, не передавайте в fwdRange делегат, который не является логически чистым. Если func получает одну и ту же точку времени при двух различных вызовах, она должна возвращать один и тот же результат оба раза. Конечно, ни одна из функций в этом модуле не имеет этой проблемы, поэтому это актуально только при создании пользовательских делегатов.
Пример
auto interval = Interval!Date(Date(2010, 9, 1), Date(2010, 9, 9));
auto func = delegate (scope const Date date) // For iterating over even-numbered days.
            {
                if ((date.day & 1) == 0)
                    return date + dur!"days"(2);

                return date + dur!"days"(1);
            };
auto range = interval.fwdRange(func);

// An odd day. Using PopFirst.yes would have made this Date(2010, 9, 2).
assert(range.front == Date(2010, 9, 1));

range.popFront();
assert(range.front == Date(2010, 9, 2));

range.popFront();
assert(range.front == Date(2010, 9, 4));

range.popFront();
assert(range.front == Date(2010, 9, 6));

range.popFront();
assert(range.front == Date(2010, 9, 8));

range.popFront();
assert(range.empty);
const IntervalRange!(TP, Direction.bwd) bwdRange(TP delegate(scope const TP) func, PopFirst popFirst = PopFirst.no);

Возвращает диапазон, который итерирует назад по интервалу, начиная с end, используя func для генерации каждой последующей точки времени.

Начало диапазона — front интервала. func используется для генерации следующей front при вызове popFront. Если popFirst — PopFirst.yes, то popFront вызывается перед возвратом диапазона (чтобы front была точкой времени, которую func сгенерировал бы).

Если func когда-либо сгенерирует точку времени, большую или равную текущей front диапазона, будет выброшено исключение std.datetime.date.DateTimeException. Диапазон будет пустым и итерация завершится, когда func сгенерирует точку времени, равную или меньшую begin интервала.

В этом модуле есть вспомогательные функции для генерации общих делегатов для передачи в bwdRange. Их документация начинается с «Функция генерации диапазона», что облегчает поиск.

Параметры:
TP delegate(scope const TP) func Функция, используемая для генерации точек времени диапазона по интервалу.
PopFirst popFirst Вызывать ли popFront в диапазоне перед возвратом.
Исключения:
std.datetime.date.DateTimeException, если интервал пустой.
Предупреждение
func должна быть логически чистой. В идеале func должна быть указателем на функцию, но принудительное требование func быть чистой слишком ограничительно, а для удобства использования функций, генерирующих функции для передачи в fwdRange, func должна быть делегатом.
Если func сохраняет состояние, которое меняется при вызове, то некоторые алгоритмы могут работать неправильно, потому что диапазон save не сохранил состояние диапазона. Чтобы избежать таких ошибок, не передавайте в fwdRange делегат, который не является логически чистым. Если func получает одну и ту же точку времени при двух различных вызовах, она должна возвращать один и тот же результат оба раза. Конечно, ни одна из функций в этом модуле не имеет этой проблемы, поэтому это актуально только для пользовательских делегатов.
Пример
auto interval = Interval!Date(Date(2010, 9, 1), Date(2010, 9, 9));
auto func = delegate (scope const Date date) // For iterating over even-numbered days.
            {
                if ((date.day & 1) == 0)
                    return date - dur!"days"(2);

                return date - dur!"days"(1);
            };
auto range = interval.bwdRange(func);

// An odd day. Using PopFirst.yes would have made this Date(2010, 9, 8).
assert(range.front == Date(2010, 9, 9));

range.popFront();
assert(range.front == Date(2010, 9, 8));

range.popFront();
assert(range.front == Date(2010, 9, 6));

range.popFront();
assert(range.front == Date(2010, 9, 4));

range.popFront();
assert(range.front == Date(2010, 9, 2));

range.popFront();
assert(range.empty);
const nothrow @safe string toString();

const void toString(Writer)(ref Writer w)
Constraints: if (isOutputRange!(Writer, char));

Преобразует этот интервал в строку.

Параметры:
Writer w Диапазон, принимающий выводной диапазон
Возвращает:
Строку при отсутствии выводного диапазона; выводной диапазон в противном случае.
struct PosInfInterval(TP);

Представляет временной интервал, в котором конечная точка — положительная бесконечность.

Любые диапазоны, итерирующие по PosInfInterval, являются бесконечными. Поэтому основное назначение PosInfInterval — создать бесконечный диапазон, начинающийся в определённую точку времени и простирающийся до положительной бесконечности.

pure nothrow this(scope const TP begin);
Параметры:
TP begin Момент времени, с которого начинается интервал.
Пример
auto interval = PosInfInterval!Date(Date(1996, 1, 2));
pure nothrow ref PosInfInterval opAssign(ref const PosInfInterval rhs);
Параметры:
PosInfInterval rhs Интервал, который нужно назначить этому.
pure nothrow ref PosInfInterval opAssign(PosInfInterval rhs);
Параметры:
PosInfInterval rhs Интервал, который нужно назначить этому.
const pure nothrow @property TP begin();

Начальная точка интервала. Она включена в интервал.

Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).begin == Date(1996, 1, 2));
pure nothrow @property void begin(TP timePoint);

Начальная точка интервала. Она включена в интервал.

Параметры:
TP timePoint Момент времени, который нужно установить.
enum bool empty;

Является ли длина интервала 0. Всегда возвращает false.

Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).empty);
const pure nothrow bool contains(TP timePoint);

Является ли данный момент времени частью этого интервала.

Параметры:
TP timePoint Момент времени, для которого нужно проверить включение в интервал.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).contains(Date(1994, 12, 24)));
assert(PosInfInterval!Date(Date(1996, 1, 2)).contains(Date(2000, 1, 5)));
const pure bool contains(scope const Interval!TP interval);

Является ли заданный интервал полностью частью этого интервала.

Параметры:
Interval!TP interval Интервал, для которого нужно проверить включение в этот интервал.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).contains(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(PosInfInterval!Date(Date(1996, 1, 2)).contains(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(PosInfInterval!Date(Date(1996, 1, 2)).contains(
            Interval!Date(Date(1998, 2, 28), Date(2013, 5, 1))));
const pure nothrow bool contains(scope const PosInfInterval interval);

Является ли заданный интервал полностью частью этого интервала.

Параметры:
PosInfInterval interval Интервал, для которого нужно проверить включение в этот интервал.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).contains(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).contains(
            PosInfInterval!Date(Date(1995, 7, 2))));
const pure nothrow bool contains(scope const NegInfInterval!TP interval);

Является ли заданный интервал полностью частью этого интервала.

Всегда возвращает false, потому что интервал, уходящий в положительную бесконечность, никогда не может содержать интервал, начинающийся в минус бесконечности.

Параметры:
NegInfInterval!TP interval Интервал, для которого нужно проверить включение в этот интервал.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).contains(
            NegInfInterval!Date(Date(1996, 5, 4))));
const pure nothrow bool isBefore(scope const TP timePoint);

Находится ли этот интервал до заданного момента времени.

Всегда возвращает false, так как интервал, уходящий в положительную бесконечность, никогда не может быть раньше любого момента времени.

Параметры:
TP timePoint Момент времени, для которого нужно проверить, является ли этот интервал раньше.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(Date(1994, 12, 24)));
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(Date(2000, 1, 5)));
const pure bool isBefore(scope const Interval!TP interval);

Находится ли этот интервал до заданного интервала и не пересекается ли с ним.

Всегда возвращает false (если заданный интервал не пустой), так как интервал, уходящий в положительную бесконечность, никогда не может быть раньше любого другого интервала.

Параметры:
Interval!TP interval Интервал, для сравнения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));
const pure nothrow bool isBefore(scope const PosInfInterval interval);

Находится ли этот интервал до заданного интервала и не пересекается ли с ним.

Всегда возвращает false, так как интервал, уходящий в положительную бесконечность, никогда не может быть раньше любого другого интервала.

Параметры:
PosInfInterval interval Интервал, для сравнения с этим интервалом.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(
            PosInfInterval!Date(Date(1992, 5, 4))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(
            PosInfInterval!Date(Date(2013, 3, 7))));
const pure nothrow bool isBefore(scope const NegInfInterval!TP interval);

Находится ли этот интервал до заданного интервала и не пересекается ли с ним.

Всегда возвращает false, так как интервал, уходящий в положительную бесконечность, никогда не может быть раньше любого другого интервала.

Параметры:
NegInfInterval!TP interval Интервал, для сравнения с этим интервалом.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(
            NegInfInterval!Date(Date(1996, 5, 4))));
const pure nothrow bool isAfter(scope const TP timePoint);

Находится ли этот интервал после заданного момента времени.

Параметры:
TP timePoint Момент времени, для которого нужно проверить, является ли этот интервал позже.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).isAfter(Date(1994, 12, 24)));
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAfter(Date(2000, 1, 5)));
const pure bool isAfter(scope const Interval!TP interval);

Находится ли этот интервал после заданного интервала и не пересекается ли с ним.

Параметры:
Interval!TP interval Интервал, для сравнения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            Interval!Date(Date(1989, 3, 1), Date(1996, 1, 2))));
const pure nothrow bool isAfter(scope const PosInfInterval interval);

Находится ли этот интервал после заданного интервала и не пересекается ли с ним.

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

Параметры:
PosInfInterval interval Интервал, для сравнения с этим интервалом.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            PosInfInterval!Date(Date(1990, 1, 7))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            PosInfInterval!Date(Date(1999, 5, 4))));
const pure nothrow bool isAfter(scope const NegInfInterval!TP interval);

Находится ли этот интервал после заданного интервала и не пересекается ли с ним.

Параметры:
NegInfInterval!TP interval Интервал, для сравнения с этим интервалом.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            NegInfInterval!Date(Date(1996, 1, 2))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAfter(
            NegInfInterval!Date(Date(2000, 7, 1))));
const pure bool intersects(scope const Interval!TP interval);

Пересекается ли заданный интервал с этим интервалом.

Параметры:
Interval!TP interval Интервал, для проверки пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            Interval!Date(Date(1989, 3, 1), Date(1996, 1, 2))));
const pure nothrow bool intersects(scope const PosInfInterval interval);

Пересекается ли заданный интервал с этим интервалом.

Всегда возвращает true, так как два интервала, уходящие в положительную бесконечность, всегда пересекаются.

Параметры:
PosInfInterval interval Интервал, для проверки пересечения с этим интервалом.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            PosInfInterval!Date(Date(1990, 1, 7))));

assert(PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            PosInfInterval!Date(Date(1999, 5, 4))));
const pure nothrow bool intersects(scope const NegInfInterval!TP interval);

Пересекается ли заданный интервал с этим интервалом.

Параметры:
NegInfInterval!TP interval Интервал, для проверки пересечения с этим интервалом.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            NegInfInterval!Date(Date(1996, 1, 2))));

assert(PosInfInterval!Date(Date(1996, 1, 2)).intersects(
            NegInfInterval!Date(Date(2000, 7, 1))));
const Interval!TP intersection(scope const Interval!TP interval);

Возвращает пересечение двух интервалов.

Параметры:
Interval!TP interval Интервал для пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если интервалы не пересекаются или заданный интервал пустой.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2000, 8, 2)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))) ==
       Interval!Date(Date(1999, 1 , 12), Date(2011, 9, 17)));
const pure nothrow PosInfInterval intersection(scope const PosInfInterval interval);

Возвращает пересечение двух интервалов.

Параметры:
PosInfInterval interval Интервал для пересечения с этим интервалом.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
            PosInfInterval!Date(Date(1999, 1, 12))) ==
       PosInfInterval!Date(Date(1999, 1 , 12)));
const Interval!TP intersection(scope const NegInfInterval!TP interval);

Возвращает пересечение двух интервалов

Параметры:
NegInfInterval!TP interval Интервал для пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если два интервала не пересекаются.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
            NegInfInterval!Date(Date(1999, 7, 6))) ==
       Interval!Date(Date(1996, 1 , 2), Date(1999, 7, 6)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       Interval!Date(Date(1996, 1 , 2), Date(2013, 1, 12)));
const pure bool isAdjacent(scope const Interval!TP interval);

Является ли заданный интервал смежным с этим интервалом.

Параметры:
Interval!TP interval Интервал, для проверки смежности с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).isAdjacent(
            Interval!Date(Date(1989, 3, 1), Date(1996, 1, 2))));

assert(!PosInfInterval!Date(Date(1999, 1, 12)).isAdjacent(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));
const pure nothrow bool isAdjacent(scope const PosInfInterval interval);

Является ли заданный интервал смежным с этим интервалом.

Всегда возвращает false, потому что два интервала, стремящиеся к положительной бесконечности, никогда не могут быть смежными друг с другом.

Параметры:
PosInfInterval interval Интервал, для проверки смежности с этим интервалом.
Пример
assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAdjacent(
            PosInfInterval!Date(Date(1990, 1, 7))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAdjacent(
            PosInfInterval!Date(Date(1996, 1, 2))));
const pure nothrow bool isAdjacent(scope const NegInfInterval!TP interval);

Является ли заданный интервал смежным с этим интервалом.

Параметры:
NegInfInterval!TP interval Интервал, для проверки смежности с этим интервалом.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).isAdjacent(
            NegInfInterval!Date(Date(1996, 1, 2))));

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isAdjacent(
            NegInfInterval!Date(Date(2000, 7, 1))));
const PosInfInterval merge(scope const Interval!TP interval);

Возвращает объединение двух интервалов

Параметры:
Interval!TP interval Интервал для объединения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если два интервала не пересекаются и не смежны, или если заданный интервал пуст.
Примечание
Нет перегрузки для merge, которая принимает NegInfInterval, потому что интервал, простирающийся от минус бесконечности до плюс бесконечности, невозможен.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).merge(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       PosInfInterval!Date(Date(1990, 7 , 6)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).merge(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));
const pure nothrow PosInfInterval merge(scope const PosInfInterval interval);

Возвращает объединение двух интервалов

Параметры:
PosInfInterval interval Интервал для объединения с этим интервалом.
Примечание
Нет перегрузки для merge, которая принимает NegInfInterval, потому что интервал, простирающийся от минус бесконечности до плюс бесконечности, невозможен.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).merge(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       PosInfInterval!Date(Date(1990, 7 , 6)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).merge(
            PosInfInterval!Date(Date(1999, 1, 12))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));
const pure PosInfInterval span(scope const Interval!TP interval);

Возвращает интервал, охватывающий от самого раннего временного момента двух интервалов до (но не включая) самого позднего временного момента двух интервалов.

Параметры:
Interval!TP interval Интервал для создания диапазона вместе с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Примечание
Нет перегрузки для span, которая принимает NegInfInterval, потому что интервал, простирающийся от минус бесконечности до плюс бесконечности, невозможен.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).span(
            Interval!Date(Date(500, 8, 9), Date(1602, 1, 31))) ==
       PosInfInterval!Date(Date(500, 8, 9)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).span(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       PosInfInterval!Date(Date(1990, 7 , 6)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).span(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));
const pure nothrow PosInfInterval span(scope const PosInfInterval interval);

Возвращает интервал, охватывающий от самого раннего временного момента двух интервалов до (но не включая) самого позднего временного момента двух интервалов.

Параметры:
PosInfInterval interval Интервал для создания диапазона вместе с этим интервалом.
Примечание
Нет перегрузки для span, которая принимает NegInfInterval, потому что интервал, простирающийся от минус бесконечности до плюс бесконечности, невозможен.
Пример
assert(PosInfInterval!Date(Date(1996, 1, 2)).span(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       PosInfInterval!Date(Date(1990, 7 , 6)));

assert(PosInfInterval!Date(Date(1996, 1, 2)).span(
            PosInfInterval!Date(Date(1999, 1, 12))) ==
       PosInfInterval!Date(Date(1996, 1 , 2)));
pure nothrow void shift(D)(D duration)
Constraints: if (__traits(compiles, begin + duration));

Сдвигает начало этого интервала вперед или назад во времени на заданную длительность (положительная длительность сдвигает интервал вперед; отрицательная длительность — назад). Эффективно выполняет begin += duration.

Параметры:
D duration Длительность сдвига интервала.
Пример
auto interval1 = PosInfInterval!Date(Date(1996, 1, 2));
auto interval2 = PosInfInterval!Date(Date(1996, 1, 2));

interval1.shift(dur!"days"(50));
assert(interval1 == PosInfInterval!Date(Date(1996, 2, 21)));

interval2.shift(dur!"days"(-50));
assert(interval2 == PosInfInterval!Date(Date(1995, 11, 13)));
void shift(T)(T years, T months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes)
Constraints: if (isIntegral!T);

Сдвигает начало этого интервала вперед или назад во времени на заданное количество лет и/или месяцев (положительное число лет и месяцев сдвигает интервал вперед; отрицательное число — назад). Добавляет заданные годы и месяца к begin. Эффективно вызывает add!"years"() и затем add!"months"() для begin с заданным количеством лет и месяцев.

Параметры:
T years Количество лет сдвига интервала.
T months Количество месяцев сдвига интервала.
AllowDayOverflow allowOverflow Разрешить ли переполнение дней в begin, вызывая при этом приращение месяца.
Исключения:
std.datetime.date.DateTimeException если этот интервал пустой или полученный интервал недействителен.
Пример
auto interval1 = PosInfInterval!Date(Date(1996, 1, 2));
auto interval2 = PosInfInterval!Date(Date(1996, 1, 2));

interval1.shift(dur!"days"(50));
assert(interval1 == PosInfInterval!Date(Date(1996, 2, 21)));

interval2.shift(dur!"days"(-50));
assert(interval2 == PosInfInterval!Date(Date(1995, 11, 13)));
pure nothrow void expand(D)(D duration)
Constraints: if (__traits(compiles, begin + duration));

Расширяет интервал назад во времени. Эффективно выполняет begin -= duration.

Параметры:
D duration Длительность расширения интервала.
Пример
auto interval1 = PosInfInterval!Date(Date(1996, 1, 2));
auto interval2 = PosInfInterval!Date(Date(1996, 1, 2));

interval1.expand(dur!"days"(2));
assert(interval1 == PosInfInterval!Date(Date(1995, 12, 31)));

interval2.expand(dur!"days"(-2));
assert(interval2 == PosInfInterval!Date(Date(1996, 1, 4)));
void expand(T)(T years, T months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes)
Constraints: if (isIntegral!T);

Расширяет интервал вперед и/или назад во времени. Эффективно вычитает заданное количество месяцев/лет из begin.

Параметры:
T years Количество лет расширения интервала.
T months Количество месяцев расширения интервала.
AllowDayOverflow allowOverflow Разрешить ли переполнение дней в begin, вызывая при этом приращение месяца.
Исключения:
std.datetime.date.DateTimeException если этот интервал пустой или полученный интервал недействителен.
Пример
auto interval1 = PosInfInterval!Date(Date(1996, 1, 2));
auto interval2 = PosInfInterval!Date(Date(1996, 1, 2));

interval1.expand(2);
assert(interval1 == PosInfInterval!Date(Date(1994, 1, 2)));

interval2.expand(-2);
assert(interval2 == PosInfInterval!Date(Date(1998, 1, 2)));
const PosInfIntervalRange!TP fwdRange(TP delegate(scope const TP) func, PopFirst popFirst = PopFirst.no);

Возвращает диапазон, который итерируется вперёд по интервалу, начиная с begin, используя func для генерации каждого последующего момента времени.

Диапазон front интервала begin. func используется для генерации следующего front при вызове popFront. Если popFirst PopFirst.yes, то popFront вызывается перед возвращением диапазона (так что front — это момент времени, который func сгенерировал бы).

Если func когда-либо сгенерирует момент времени, меньший или равный текущему front диапазона, будет выброшено исключение std.datetime.date.DateTimeException.

В этом модуле есть вспомогательные функции, которые генерируют общие делегаты для передачи в fwdRange. Их документация начинается с «Функция генерации диапазона», чтобы их легко можно было найти.

Параметры:
TP delegate(scope const TP) func Функция, используемая для генерации моментов времени диапазона в течение интервала.
PopFirst popFirst Надо ли вызвать popFront для диапазона перед его возвращением.
Исключения:
std.datetime.date.DateTimeException, если этот интервал пустой.
Предупреждение
func должна быть логически чистой. В идеале func должна быть указателем на функцию, но требование, чтобы func была чистой, слишком ограничивает. Чтобы иметь удобство использования функций, генерирующих функции для передачи в fwdRange, func должна быть делегатом.
Если func сохраняет состояние, которое меняется при её вызове, некоторые алгоритмы не будут работать правильно, потому что диапазон save не сможет действительно сохранить состояние диапазона. Чтобы избежать таких ошибок, не передавайте в fwdRange делегат, который не является логически чистым. Если func получает один и тот же момент времени при двух разных вызовах, она должна возвращать тот же результат в обоих случаях. Конечно, ни одна из функций в этом модуле не имеет этой проблемы, поэтому это актуально только для пользовательских делегатов.
Пример
auto interval = PosInfInterval!Date(Date(2010, 9, 1));
auto func = delegate (scope const Date date) //For iterating over even-numbered days.
            {
                if ((date.day & 1) == 0)
                    return date + dur!"days"(2);

                return date + dur!"days"(1);
            };
auto range = interval.fwdRange(func);

//An odd day. Using PopFirst.yes would have made this Date(2010, 9, 2).
assert(range.front == Date(2010, 9, 1));

range.popFront();
assert(range.front == Date(2010, 9, 2));

range.popFront();
assert(range.front == Date(2010, 9, 4));

range.popFront();
assert(range.front == Date(2010, 9, 6));

range.popFront();
assert(range.front == Date(2010, 9, 8));

range.popFront();
assert(!range.empty);
const nothrow string toString();

Преобразует этот интервал в строку.

struct NegInfInterval(TP);

Представляет интервал времени, начинающийся с минус бесконечности.

Любые диапазоны, которые итерируются по NegInfInterval, являются бесконечными. Таким образом, основное назначение использования NegInfInterval — создать бесконечный диапазон, начинающийся с минус бесконечности и заканчивающийся фиксированной конечной точкой. Итерируйте по нему в обратном порядке.

pure nothrow this(scope const TP end);
Параметры:
TP end Точка времени, которая завершает интервал.
Пример
auto interval = PosInfInterval!Date(Date(1996, 1, 2));
pure nothrow ref NegInfInterval opAssign(ref const NegInfInterval rhs);
Параметры:
NegInfInterval rhs Интервал, который необходимо назначить этому.
pure nothrow ref NegInfInterval opAssign(NegInfInterval rhs);
Параметры:
NegInfInterval rhs Интервал, который необходимо назначить этому.
const pure nothrow @property TP end();

Конечная точка интервала. Она исключена из интервала.

Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).end == Date(2012, 3, 1));
pure nothrow @property void end(TP timePoint);

Конечная точка интервала. Она исключена из интервала.

Параметры:
TP timePoint Точка времени, для которой необходимо установить конец.
enum bool empty;

Указывает, равна ли длина интервала 0. Всегда возвращает false.

Пример
assert(!NegInfInterval!Date(Date(1996, 1, 2)).empty);
const pure nothrow bool contains(TP timePoint);

Указывает, входит ли заданная точка времени в этот интервал.

Параметры:
TP timePoint Точка времени, для которой необходимо проверить включение в этот интервал.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).contains(Date(1994, 12, 24)));
assert(NegInfInterval!Date(Date(2012, 3, 1)).contains(Date(2000, 1, 5)));
assert(!NegInfInterval!Date(Date(2012, 3, 1)).contains(Date(2012, 3, 1)));
const pure bool contains(scope const Interval!TP interval);

Указывает, полностью ли данный интервал находится внутри этого интервала.

Параметры:
Interval!TP interval Интервал, для которого необходимо проверить включение в этот интервал.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).contains(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).contains(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).contains(
            Interval!Date(Date(1998, 2, 28), Date(2013, 5, 1))));
const pure nothrow bool contains(scope const PosInfInterval!TP interval);

Указывает, полностью ли данный интервал находится внутри этого интервала.

Всегда возвращает false, так как интервал, начинающийся с минус бесконечности, никогда не может содержать интервал, идущий до плюс бесконечности.

Параметры:
PosInfInterval!TP interval Интервал, для которого необходимо проверить включение в этот интервал.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).contains(
            PosInfInterval!Date(Date(1999, 5, 4))));
const pure nothrow bool contains(scope const NegInfInterval interval);

Указывает, полностью ли данный интервал находится внутри этого интервала.

Параметры:
NegInfInterval interval Интервал, для которого необходимо проверить включение в этот интервал.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).contains(
            NegInfInterval!Date(Date(1996, 5, 4))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).contains(
            NegInfInterval!Date(Date(2013, 7, 9))));
const pure nothrow bool isBefore(scope const TP timePoint);

Указывает, находится ли этот интервал до заданной точки времени.

Параметры:
TP timePoint Точка времени, для которой необходимо проверить, находится ли этот интервал до нее.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(Date(1994, 12, 24)));
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(Date(2000, 1, 5)));
assert(NegInfInterval!Date(Date(2012, 3, 1)).isBefore(Date(2012, 3, 1)));
const pure bool isBefore(scope const Interval!TP interval);

Указывает, находится ли этот интервал до данного интервала и не пересекается ли он с ним.

Параметры:
Interval!TP interval Интервал, для проверки по отношению к этому интервалу.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            Interval!Date(Date(2022, 10, 19), Date(2027, 6, 3))));
const pure nothrow bool isBefore(scope const PosInfInterval!TP interval);

Указывает, находится ли этот интервал до данного интервала и не пересекается ли он с ним.

Параметры:
PosInfInterval!TP interval Интервал, для проверки по отношению к этому интервалу.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            PosInfInterval!Date(Date(2012, 3, 1))));
const pure nothrow bool isBefore(scope const NegInfInterval interval);

Указывает, находится ли этот интервал до данного интервала и не пересекается ли он с ним.

Всегда возвращает false, так как интервал, начинающийся с минус бесконечности, никогда не может быть до другого интервала, начинающегося с минус бесконечности.

Параметры:
NegInfInterval interval Интервал, для проверки по отношению к этому интервалу.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            NegInfInterval!Date(Date(1996, 5, 4))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isBefore(
            NegInfInterval!Date(Date(2013, 7, 9))));
const pure nothrow bool isAfter(scope const TP timePoint);

Указывает, находится ли этот интервал после заданной точки времени.

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

Параметры:
TP timePoint Точка времени, для проверки, находится ли этот интервал после нее.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(Date(1994, 12, 24)));
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(Date(2000, 1, 5)));
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(Date(2012, 3, 1)));
const pure bool isAfter(scope const Interval!TP interval);

Указывает, находится ли этот интервал после данного интервала и не пересекается ли он с ним.

Всегда возвращает false (если только заданный интервал не пустой), так как интервал, начинающийся с минус бесконечности, никогда не может быть после любого другого интервала.

Параметры:
Interval!TP interval Интервал, для проверки по отношению к этому интервалу.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            Interval!Date(Date(2022, 10, 19), Date(2027, 6, 3))));
const pure nothrow bool isAfter(scope const PosInfInterval!TP interval);

Указывает, находится ли этот интервал после данного интервала и не пересекается ли он с ним.

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

Параметры:
PosInfInterval!TP interval Интервал, для проверки по отношению к этому интервалу.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            PosInfInterval!Date(Date(2012, 3, 1))));
const pure nothrow bool isAfter(scope const NegInfInterval interval);

Указывает, находится ли этот интервал после данного интервала и не пересекается ли он с ним.

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

Параметры:
NegInfInterval interval Интервал, для проверки по отношению к этому интервалу.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            NegInfInterval!Date(Date(1996, 5, 4))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAfter(
            NegInfInterval!Date(Date(2013, 7, 9))));
const pure bool intersects(scope const Interval!TP interval);

Указывает, перекрывается ли данный интервал с этим интервалом.

Параметры:
Interval!TP interval Интервал, для проверки пересечения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            Interval!Date(Date(1999, 1, 12), Date(2011, 9, 17))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            Interval!Date(Date(2022, 10, 19), Date(2027, 6, 3))));
const pure nothrow bool intersects(scope const PosInfInterval!TP interval);

Указывает, перекрывается ли данный интервал с этим интервалом.

Параметры:
PosInfInterval!TP interval Интервал, для проверки пересечения с этим интервалом.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            PosInfInterval!Date(Date(2012, 3, 1))));
const pure nothrow bool intersects(scope const NegInfInterval!TP interval);

Указывает, перекрывается ли данный интервал с этим интервалом.

Всегда возвращает true, так как два интервала, начинающиеся с минус бесконечности, всегда перекрываются.

Параметры:
NegInfInterval!TP interval Интервал, для проверки пересечения с этим интервалом.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            NegInfInterval!Date(Date(1996, 5, 4))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).intersects(
            NegInfInterval!Date(Date(2013, 7, 9))));
const Interval!TP intersection(scope const Interval!TP interval);

Возвращает пересечение двух интервалов

Параметры:
Interval!TP interval Интервал, с которым необходимо найти пересечение.
Исключения:
std.datetime.date.DateTimeException если интервалы не пересекаются или если заданный интервал пустой.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).intersection(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       Interval!Date(Date(1990, 7 , 6), Date(2000, 8, 2)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).intersection(
            Interval!Date(Date(1999, 1, 12), Date(2015, 9, 2))) ==
       Interval!Date(Date(1999, 1 , 12), Date(2012, 3, 1)));
const Interval!TP intersection(scope const PosInfInterval!TP interval);

Возвращает пересечение двух интервалов

Параметры:
PosInfInterval!TP interval Интервал, с которым необходимо найти пересечение.
Исключения:
std.datetime.date.DateTimeException если интервалы не пересекаются.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).intersection(
            PosInfInterval!Date(Date(1990, 7, 6))) ==
       Interval!Date(Date(1990, 7 , 6), Date(2012, 3, 1)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).intersection(
            PosInfInterval!Date(Date(1999, 1, 12))) ==
       Interval!Date(Date(1999, 1 , 12), Date(2012, 3, 1)));
const nothrow NegInfInterval intersection(scope const NegInfInterval interval);

Возвращает пересечение двух интервалов

Параметры:
NegInfInterval interval Интервал для пересечения с этим интервалом.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).intersection(
            NegInfInterval!Date(Date(1999, 7, 6))) ==
       NegInfInterval!Date(Date(1999, 7 , 6)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).intersection(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));
const pure bool isAdjacent(scope const Interval!TP interval);

Является ли данный интервал смежным с этим интервалом.

Параметры:
Interval!TP interval Интервал, для проверки смежности с этим интервалом.
Исключения:
std.datetime.date.DateTimeException, если заданный интервал пустой.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(1999, 1, 12), Date(2012, 3, 1))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(2012, 3, 1), Date(2019, 2, 2))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            Interval!Date(Date(2022, 10, 19), Date(2027, 6, 3))));
const pure nothrow bool isAdjacent(scope const PosInfInterval!TP interval);

Является ли данный интервал смежным с этим интервалом.

Параметры:
PosInfInterval!TP interval Интервал, для проверки смежности с этим интервалом.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            PosInfInterval!Date(Date(1999, 5, 4))));

assert(NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            PosInfInterval!Date(Date(2012, 3, 1))));
const pure nothrow bool isAdjacent(scope const NegInfInterval interval);

Является ли данный интервал смежным с этим интервалом.

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

Параметры:
NegInfInterval interval Интервал, для проверки смежности с этим интервалом.
Пример
assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            NegInfInterval!Date(Date(1996, 5, 4))));

assert(!NegInfInterval!Date(Date(2012, 3, 1)).isAdjacent(
            NegInfInterval!Date(Date(2012, 3, 1))));
const NegInfInterval merge(scope const Interval!TP interval);

Возвращает объединение двух интервалов

Параметры:
Interval!TP interval Интервал для объединения с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если два интервала не пересекаются и не являются смежными или если заданный интервал пустой.
Примечание
Нет перегрузки для merge, которая принимает PosInfInterval, потому что интервал от минус бесконечности до плюс бесконечности невозможен.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).merge(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).merge(
            Interval!Date(Date(1999, 1, 12), Date(2015, 9, 2))) ==
       NegInfInterval!Date(Date(2015, 9 , 2)));
const pure nothrow NegInfInterval merge(scope const NegInfInterval interval);

Возвращает объединение двух интервалов

Параметры:
NegInfInterval interval Интервал для объединения с этим интервалом.
Примечание
Нет перегрузки для merge, которая принимает PosInfInterval, потому что интервал от минус бесконечности до плюс бесконечности невозможен.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).merge(
            NegInfInterval!Date(Date(1999, 7, 6))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).merge(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       NegInfInterval!Date(Date(2013, 1 , 12)));
const pure NegInfInterval span(scope const Interval!TP interval);

Возвращает интервал, охватывающий с самого раннего временного момента двух интервалов до (но не включая) самого позднего временного момента двух интервалов.

Параметры:
Interval!TP interval Интервал для создания интервала покрытия вместе с этим интервалом.
Исключения:
std.datetime.date.DateTimeException если заданный интервал пустой.
Примечание
Нет перегрузки для span, которая принимает PosInfInterval, потому что интервал от минус бесконечности до плюс бесконечности невозможен.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).span(
            Interval!Date(Date(1990, 7, 6), Date(2000, 8, 2))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).span(
            Interval!Date(Date(1999, 1, 12), Date(2015, 9, 2))) ==
       NegInfInterval!Date(Date(2015, 9 , 2)));

assert(NegInfInterval!Date(Date(1600, 1, 7)).span(
            Interval!Date(Date(2012, 3, 11), Date(2017, 7, 1))) ==
       NegInfInterval!Date(Date(2017, 7 , 1)));
const pure nothrow NegInfInterval span(scope const NegInfInterval interval);

Возвращает интервал, охватывающий с самого раннего временного момента двух интервалов до (но не включая) самого позднего временного момента двух интервалов.

Параметры:
NegInfInterval interval Интервал для создания интервала покрытия вместе с этим интервалом.
Примечание
Нет перегрузки для span, которая принимает PosInfInterval, потому что интервал от минус бесконечности до плюс бесконечности невозможен.
Пример
assert(NegInfInterval!Date(Date(2012, 3, 1)).span(
            NegInfInterval!Date(Date(1999, 7, 6))) ==
       NegInfInterval!Date(Date(2012, 3 , 1)));

assert(NegInfInterval!Date(Date(2012, 3, 1)).span(
            NegInfInterval!Date(Date(2013, 1, 12))) ==
       NegInfInterval!Date(Date(2013, 1 , 12)));
pure nothrow void shift(D)(D duration)
Constraints: if (__traits(compiles, end + duration));

Перемещает конец этого интервала вперёд или назад во времени на заданную продолжительность (положительная продолжительность сдвигает интервал вперёд, отрицательная – назад). Эффективно, это end.

Параметры:
D duration Продолжительность сдвига интервала.
Пример
auto interval1 = NegInfInterval!Date(Date(2012, 4, 5));
auto interval2 = NegInfInterval!Date(Date(2012, 4, 5));

interval1.shift(dur!"days"(50));
assert(interval1 == NegInfInterval!Date(Date(2012, 5, 25)));

interval2.shift(dur!"days"(-50));
assert(interval2 == NegInfInterval!Date( Date(2012, 2, 15)));
void shift(T)(T years, T months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes)
Constraints: if (isIntegral!T);

Перемещает конец этого интервала вперёд или назад во времени на заданное количество лет и/или месяцев (положительное количество лет и месяцев сдвигает интервал вперёд, отрицательное – назад). Добавляет заданное количество лет и месяцев к концу. Эффективно вызывает add!"years"() и затем add!"months"() для конца с заданным количеством лет и месяцев.

Параметры:
T years Количество лет сдвига интервала.
T months Количество месяцев сдвига интервала.
AllowDayOverflow allowOverflow Разрешить ли переполнение дней в end, вызывая увеличение месяца.
Исключения:
std.datetime.date.DateTimeException если пусто равно true или полученный интервал будет недействительным.
Пример
auto interval1 = NegInfInterval!Date(Date(2012, 3, 1));
auto interval2 = NegInfInterval!Date(Date(2012, 3, 1));

interval1.shift(2);
assert(interval1 == NegInfInterval!Date(Date(2014, 3, 1)));

interval2.shift(-2);
assert(interval2 == NegInfInterval!Date(Date(2010, 3, 1)));
pure nothrow void expand(D)(D duration)
Constraints: if (__traits(compiles, end + duration));

Расширяет интервал вперёд во времени. Эффективно end += duration.

Параметры:
D duration Продолжительность расширения интервала.
Пример
auto interval1 = NegInfInterval!Date(Date(2012, 3, 1));
auto interval2 = NegInfInterval!Date(Date(2012, 3, 1));

interval1.expand(dur!"days"(2));
assert(interval1 == NegInfInterval!Date(Date(2012, 3, 3)));

interval2.expand(dur!"days"(-2));
assert(interval2 == NegInfInterval!Date(Date(2012, 2, 28)));
void expand(T)(T years, T months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes)
Constraints: if (isIntegral!T);

Расширяет интервал вперёд и/или назад во времени. Эффективно добавляет заданное количество месяцев/лет к концу.

Параметры:
T years Количество лет расширения интервала.
T months Количество месяцев расширения интервала.
AllowDayOverflow allowOverflow Разрешить ли переполнение дней в end, вызывая увеличение месяца.
Исключения:
std.datetime.date.DateTimeException если пусто равно true или полученный интервал будет недействительным.
Пример
auto interval1 = NegInfInterval!Date(Date(2012, 3, 1));
auto interval2 = NegInfInterval!Date(Date(2012, 3, 1));

interval1.expand(2);
assert(interval1 == NegInfInterval!Date(Date(2014, 3, 1)));

interval2.expand(-2);
assert(interval2 == NegInfInterval!Date(Date(2010, 3, 1)));
const NegInfIntervalRange!TP bwdRange(TP delegate(scope const TP) func, PopFirst popFirst = PopFirst.no);

Возвращает диапазон, который итерируется назад по интервалу, начиная с end, используя func для генерации каждого последующего временного момента.

Диапазон front это конец интервала. func используется для генерации следующего front когда popFront вызывается. Если popFirst равно PopFirst.yes, то popFront вызывается перед возвращением диапазона (так, что front это временная точка, которую func сгенерирует).

Если func когда-либо сгенерирует временную точку, большую или равную текущему front диапазона, то будет брошено исключение std.datetime.date.DateTimeException.

В этом модуле есть вспомогательные функции, которые генерируют общие делегаты для передачи в bwdRange. Их документация начинается с "Функция генерации диапазона" для их лёгкого поиска.

Параметры:
TP delegate(scope const TP) func Функция, используемая для генерации временных точек диапазона по интервалу.
PopFirst popFirst Вызывать ли popFront в диапазоне перед его возвращением.
Исключения:
std.datetime.date.DateTimeException если этот интервал пуст.
Предупреждение
func должна быть логически чистой. В идеале, func должна быть указателем на функцию, но принуждение func к чистоте слишком ограничительно, и для обеспечения удобства использования функций, генерирующих функции для передачи в fwdRange, func должна быть делегатом.
Если func сохраняет состояние, которое изменяется при вызове, то некоторые алгоритмы будут работать неправильно, потому что диапазон save не смог действительно сохранить состояние диапазона. Чтобы избежать таких ошибок, не передавайте делегат, который не является логически чистым в fwdRange. Если func получает ту же временную точку с двумя разными вызовами, она должна возвращать тот же результат в обоих случаях. Конечно, ни одна из функций в этом модуле не имеет этой проблемы, поэтому это актуально только для пользовательских делегатов.
Пример
auto interval = NegInfInterval!Date(Date(2010, 9, 9));
auto func = delegate (scope const Date date) //For iterating over even-numbered days.
            {
                if ((date.day & 1) == 0)
                    return date - dur!"days"(2);

                return date - dur!"days"(1);
            };
auto range = interval.bwdRange(func);

assert(range.front == Date(2010, 9, 9)); //An odd day. Using PopFirst.yes would have made this Date(2010, 9, 8).

range.popFront();
assert(range.front == Date(2010, 9, 8));

range.popFront();
assert(range.front == Date(2010, 9, 6));

range.popFront();
assert(range.front == Date(2010, 9, 4));

range.popFront();
assert(range.front == Date(2010, 9, 2));

range.popFront();
assert(!range.empty);
const nothrow string toString();

Преобразует этот интервал в строку.

nothrow TP delegate(scope const TP) everyDayOfWeek(TP, Direction dir = Direction.fwd)(DayOfWeek dayOfWeek)
Constraints: if (isTimePoint!TP && (dir == Direction.fwd || dir == Direction.bwd) && __traits(hasMember, TP, "dayOfWeek") && !__traits(isStaticFunction, TP.dayOfWeek) && is(typeof(TP.dayOfWeek) == DayOfWeek));

Функция генерации диапазона.

Возвращает делегат, который возвращает следующую точку времени с заданным DayOfWeek в диапазоне.

Использование этого делегата позволяет итерироваться по последовательным точкам времени, которые все имеют одинаковый день недели. Например, передача DayOfWeek.mon в everyDayOfWeek приведет к делегату, который можно использовать для итерации по всем понедельникам в диапазоне.

Параметры:
dir Направление итерации. Если возвращаемое значение передается в fwdRange, используйте Direction.fwd. Если передается в bwdRange, используйте Direction.bwd.
DayOfWeek dayOfWeek День недели, который будет у каждой точки времени в диапазоне.
Примеры:
import std.datetime.date : Date, DayOfWeek;

auto interval = Interval!Date(Date(2010, 9, 2), Date(2010, 9, 27));
auto func = everyDayOfWeek!Date(DayOfWeek.mon);
auto range = interval.fwdRange(func);

// A Thursday. Using PopFirst.yes would have made this Date(2010, 9, 6).
writeln(range.front); // Date(2010, 9, 2)

range.popFront();
writeln(range.front); // Date(2010, 9, 6)

range.popFront();
writeln(range.front); // Date(2010, 9, 13)

range.popFront();
writeln(range.front); // Date(2010, 9, 20)

range.popFront();
assert(range.empty);
TP delegate(scope const TP) everyMonth(TP, Direction dir = Direction.fwd)(int month)
Constraints: if (isTimePoint!TP && (dir == Direction.fwd || dir == Direction.bwd) && __traits(hasMember, TP, "month") && !__traits(isStaticFunction, TP.month) && is(typeof(TP.month) == Month));

Функция генерации диапазона.

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

Таким образом, использование этого делегата позволяет итерироваться по последовательным точкам времени, которые находятся в одном и том же месяце, но в разных годах. Например, итерируйтесь по каждому последующему 25 декабря в интервале, начав с даты, у которой 25-е число как день и передав Month.dec в everyMonth для создания делегата.

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

Параметры:
dir Направление итерации. Если возвращаемое значение передается в fwdRange, используйте Direction.fwd. Если передается в bwdRange, используйте Direction.bwd.
int month Месяц, в котором будет находиться каждая точка времени в диапазоне (январь — 1).
Примеры:
import std.datetime.date : Date, Month;

auto interval = Interval!Date(Date(2000, 1, 30), Date(2004, 8, 5));
auto func = everyMonth!Date(Month.feb);
auto range = interval.fwdRange(func);

// Using PopFirst.yes would have made this Date(2010, 2, 29).
writeln(range.front); // Date(2000, 1, 30)

range.popFront();
writeln(range.front); // Date(2000, 2, 29)

range.popFront();
writeln(range.front); // Date(2001, 2, 28)

range.popFront();
writeln(range.front); // Date(2002, 2, 28)

range.popFront();
writeln(range.front); // Date(2003, 2, 28)

range.popFront();
writeln(range.front); // Date(2004, 2, 28)

range.popFront();
assert(range.empty);
nothrow TP delegate(scope const TP) everyDuration(TP, Direction dir = Direction.fwd, D)(D duration)
Constraints: if (isTimePoint!TP && __traits(compiles, TP.init + duration) && (dir == Direction.fwd || dir == Direction.bwd));

Функция генерации диапазона.

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

Использование этого делегата позволяет итерироваться по последовательным точкам времени, которые разделены заданной длительностью. Например, передача dur!"days"(3) в everyDuration приведет к делегату, который можно использовать для итерации по диапазону дней, каждый из которых разделен тремя днями.

Параметры:
dir Направление итерации. Если возвращаемое значение передается в fwdRange, используйте Direction.fwd. Если передается в bwdRange, используйте Direction.bwd.
D duration Длительность, которая разделяет каждую последующую точку времени в диапазоне.
Примеры:
import core.time : dur;
import std.datetime.date : Date;

auto interval = Interval!Date(Date(2010, 9, 2), Date(2010, 9, 27));
auto func = everyDuration!Date(dur!"days"(8));
auto range = interval.fwdRange(func);

// Using PopFirst.yes would have made this Date(2010, 9, 10).
writeln(range.front); // Date(2010, 9, 2)

range.popFront();
writeln(range.front); // Date(2010, 9, 10)

range.popFront();
writeln(range.front); // Date(2010, 9, 18)

range.popFront();
writeln(range.front); // Date(2010, 9, 26)

range.popFront();
assert(range.empty);
nothrow TP delegate(scope const TP) everyDuration(TP, Direction dir = Direction.fwd, D)(int years, int months = 0, AllowDayOverflow allowOverflow = AllowDayOverflow.yes, D duration = dur!"days"(0))
Constraints: if (isTimePoint!TP && __traits(compiles, TP.init + duration) && __traits(compiles, TP.init.add!"years"(years)) && __traits(compiles, TP.init.add!"months"(months)) && (dir == Direction.fwd || dir == Direction.bwd));

Функция генерации диапазона.

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

Разница между этим вариантом everyDuration и вариантом, который принимает только core.time.Duration, заключается в том, что этот также принимает количество лет и месяцев (наряду с AllowDayOverflow для указания, должно ли добавление лет и месяцев допускать переполнение дней).

Обратите внимание, что при итерации вперед вызывается add!"years"() для заданной точки времени, затем add!"months"(), и, наконец, к ней добавляется длительность. Однако при итерации назад сначала добавляется длительность, затем вызывается add!"months"(), и, наконец, вызывается add!"years"(). Таким образом, при обратном проходе генерируются близкие к тем же точкам времени, что и при итерации вперед, но поскольку добавление лет и месяцев не полностью обратимо (из-за возможного переполнения дней, независимо от того, используется AllowDayOverflow.yes или AllowDayOverflow.no), нельзя гарантировать, что при обратном проходе будут получены те же точки времени, что и при итерации вперед (даже если предположить, что конец диапазона — это точка времени, которая будет возвращена делегатом при итерации вперед от begin).

Параметры:
dir Направление итерации. Если возвращаемое значение передается в fwdRange, используйте Direction.fwd. Если передается в bwdRange, используйте Direction.bwd.
int years Количество лет для добавления к точке времени, переданной делегату.
int months Количество месяцев для добавления к точке времени, переданной делегату.
AllowDayOverflow allowOverflow Разрешить ли переполнение дней при begin и end, вызывая увеличение их месяца.
D duration Длительность для добавления к точке времени, переданной делегату.
Примеры:
import core.time : dur;
import std.datetime.date : AllowDayOverflow, Date;

auto interval = Interval!Date(Date(2010, 9, 2), Date(2025, 9, 27));
auto func = everyDuration!Date(4, 1, AllowDayOverflow.yes, dur!"days"(2));
auto range = interval.fwdRange(func);

// Using PopFirst.yes would have made this Date(2014, 10, 12).
writeln(range.front); // Date(2010, 9, 2)

range.popFront();
writeln(range.front); // Date(2014, 10, 4)

range.popFront();
writeln(range.front); // Date(2018, 11, 6)

range.popFront();
writeln(range.front); // Date(2022, 12, 8)

range.popFront();
assert(range.empty);
struct IntervalRange(TP, Direction dir) if (isTimePoint!TP && (dir != Direction.both));

Диапазон значений над Interval.

IntervalRange создаётся только с помощью Interval. Однако при создании ему передаётся функция func, которая используется для генерации точек времени, по которым происходит итерация. func принимает точку времени и возвращает точку времени того же типа. Например, чтобы перебрать все дни в интервале Interval!Date, передайте функцию в fwdRange Interval, где эта функция принимает std.datetime.date.Date и возвращает std.datetime.date.Date, который на один день позже. Затем эта функция будет использоваться IntervalRange в popFront для итерации по std.datetime.date.Date в интервале.

Если dir == Direction.fwd, то диапазон итерируется вперёд во времени, а если dir == Direction.bwd, то он итерируется назад во времени. Итак, если dir == Direction.fwd, то front == interval.begin, а если dir == Direction.bwd, то front == interval.end. func должна генерировать точку времени, идущую в правильном направлении итерации, иначе будет брошено исключение std.datetime.date.DateTimeException. Таким образом, для итерации вперёд во времени точка времени, которую func генерирует, должна быть позже, чем та, которая ей была передана. Если она либо идентична, либо раньше, то будет брошено исключение std.datetime.date.DateTimeException. Для итерации назад, сгенерированная точка времени должна быть раньше переданной точки времени.

Если сгенерированная точка времени когда-либо пересечёт край диапазона в правильном направлении, то будет использоваться край этого диапазона. Итак, если итерировать вперёд, и сгенерированная точка времени находится за интервалом end, то front становится end. Если итерировать назад, и сгенерированная точка времени находится перед begin, то front становится begin. В любом случае диапазон станет пустым.

Также обратите внимание, что, хотя обычно начало интервала включено в него, а его конец исключён, если dir == Direction.bwd, то begin обрабатывается как исключённое, а end обрабатывается как включённое. Это позволяет получить одинаковое поведение в обоих направлениях. Это работает, потому что ни одна из функций Interval, которые заботятся о том, включено или исключено begin или end, никогда не вызывается IntervalRange. interval возвращает обычный интервал, независимо от того, dir == Direction.fwd или dir == Direction.bwd, так что любые функции Interval, которые вызываются у него, и которые заботятся о том, включены ли begin или end, будут обрабатывать begin как включённое, а end как исключённое.

pure nothrow ref IntervalRange opAssign(ref IntervalRange rhs);

pure nothrow ref IntervalRange opAssign(IntervalRange rhs);
Parameters:
IntervalRange rhs Присваиваемый IntervalRange интервал.
const pure nothrow @property bool empty();

Является ли этот IntervalRange пустым.

const pure @property TP front();

Первая точка времени в диапазоне.

Throws:
std.datetime.date.DateTimeException если диапазон пуст.
void popFront();

Удаляет front из диапазона, используя func для генерации следующей точки времени в диапазоне. Если сгенерированная точка времени выходит за пределы диапазона, то front устанавливается на этот край, и диапазон становится пустым. Итак, если итерировать вперёд, и сгенерированная точка времени больше, чем край интервала end, то front устанавливается на end. Если итерировать назад, и сгенерированная точка времени меньше, чем край интервала begin, то front устанавливается на begin.

Throws:
std.datetime.date.DateTimeException если диапазон пуст или если сгенерированная точка времени находится в неправильном направлении (т.е. если итерировать вперёд и сгенерированная точка времени раньше front, или если итерировать назад и сгенерированная точка времени после front).
pure nothrow @property IntervalRange save();

Возвращает копию this.

const pure nothrow @property Interval!TP interval();

Интервал, который в данный момент покрывает этот IntervalRange.

pure nothrow @property TP delegate(scope const TP) func();

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

const pure nothrow @property Direction direction();

Направление итерации этого диапазона.

struct PosInfIntervalRange(TP) if (isTimePoint!TP);

Диапазон значений над PosInfInterval. Это бесконечный диапазон.

PosInfIntervalRange создаётся только с помощью PosInfInterval. Однако при создании ему передаётся функция func, которая используется для генерации точек времени, по которым происходит итерация. func принимает точку времени и возвращает точку времени того же типа. Например, чтобы перебрать все дни в интервале PosInfInterval!Date, передайте функцию в fwdRange PosInfInterval, где эта функция принимает std.datetime.date.Date и возвращает std.datetime.date.Date, который на один день позже. Затем эта функция будет использоваться PosInfIntervalRange в popFront для итерации по std.datetime.date.Date в интервале - хотя, очевидно, поскольку диапазон бесконечен, для него следует использовать функцию типа std.range.take вместо итерации по всем датам.

Поскольку интервал идёт до положительной бесконечности, диапазон всегда итерируется вперёд, никогда назад. func должна генерировать точку времени в нужном направлении итерации, иначе будет брошено исключение std.datetime.date.DateTimeException. Таким образом, точки времени, которые func генерирует, должны быть позже, чем та, которая ей была передана. Если они либо идентичны, либо раньше, то будет брошено исключение std.datetime.date.DateTimeException.

pure nothrow ref PosInfIntervalRange opAssign(ref PosInfIntervalRange rhs);

pure nothrow ref PosInfIntervalRange opAssign(PosInfIntervalRange rhs);
Parameters:
PosInfIntervalRange rhs Присваиваемый PosInfIntervalRange интервал.
enum bool empty;

Этот диапазон бесконечен, поэтому он никогда не пустой.

const pure nothrow @property TP front();

Первая точка времени в диапазоне.

void popFront();

Удаляет front из диапазона, используя func для генерации следующей точки времени в диапазоне.

Throws:
std.datetime.date.DateTimeException если сгенерированная точка времени меньше front.
pure nothrow @property PosInfIntervalRange save();

Возвращает копию this.

const pure nothrow @property PosInfInterval!TP interval();

Интервал, который в данный момент покрывает этот диапазон.

pure nothrow @property TP delegate(scope const TP) func();

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

struct NegInfIntervalRange(TP) if (isTimePoint!TP);

Диапазон над NegInfInterval. Это бесконечный диапазон.

NegInfIntervalRange всегда создаётся NegInfInterval. Однако при создании ему передаётся функция func, которая используется для генерации временных точек, по которым происходит итерация. func принимает временную точку и возвращает временную точку того же типа. Например, чтобы перебрать все дни в интервале NegInfInterval!Date, передайте функцию в NegInfInterval's bwdRange, где эта функция принимает std.datetime.date.Date и возвращает std.datetime.date.Date, который на один день раньше. Затем эта функция будет использоваться NegInfIntervalRange's popFront для перебора std.datetime.date.Date в интервале — хотя, очевидно, поскольку диапазон бесконечен, следует использовать функцию, такую как std.range.take, а не перебирать все даты.

Поскольку интервал уходит в отрицательную бесконечность, диапазон всегда перебирается в обратном порядке, никогда не вперёд. func должен генерировать временную точку в нужном направлении итерации, в противном случае будет выброшено исключение std.datetime.date.DateTimeException. Таким образом, временные точки, которые func генерирует, должны быть раньше, чем та, которая ему передана. Если они одинаковы или позже, то будет выброшено исключение std.datetime.date.DateTimeException.

Также обратите внимание, что, хотя обычно начало интервала исключается из него, NegInfIntervalRange рассматривает его как включённое. Это позволяет получить такое же поведение, как и с PosInfIntervalRange. Это работает, потому что ни одна из функций NegInfInterval не учитывает, включён ли end или исключён, они никогда не вызываются NegInfIntervalRange. interval возвращает нормальный интервал, поэтому все функции NegInfInterval, вызываемые у него, которые учитывают, включено ли end или исключено, будут рассматривать end как исключённое.

pure nothrow ref NegInfIntervalRange opAssign(ref NegInfIntervalRange rhs);

pure nothrow ref NegInfIntervalRange opAssign(NegInfIntervalRange rhs);
Parameters:
NegInfIntervalRange rhs Интервал, который нужно назначить этому.
enum bool empty;

Это бесконечный диапазон, поэтому он никогда не пуст.

const pure nothrow @property TP front();

Первая временная точка в диапазоне.

void popFront();

Удаляет front из диапазона, используя func для генерации следующей временной точки в диапазоне.

Throws:
std.datetime.date.DateTimeException, если сгенерированная временная точка больше front.
pure nothrow @property NegInfIntervalRange save();

Возвращает копию this.

const pure nothrow @property NegInfInterval!TP interval();

Интервал, который в данный момент покрывает этот диапазон.

pure nothrow @property TP delegate(scope const TP) func();

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

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_datetime_interval.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API