std.datetime

Переместиться к: AllowDayOverflow · AutoStart · benchmark · clearTZEnvVar · Clock · cmpTimeUnits · CmpTimeUnits · comparingBenchmark · ComparingBenchmarkResult · Date · DateTime · DateTimeException · DayOfWeek · daysToDayOfWeek · Direction · DosFileTime · DosFileTimeToSysTime · enforceValid · everyDayOfWeek · everyDuration · everyMonth · FILETIMEToStdTime · FILETIMEToSysTime · Interval · IntervalRange · isTimePoint · LocalTime · measureTime · Month · monthsToMonth · NegInfInterval · NegInfIntervalRange · parseRFC822DateTime · parseTZConversions · PopFirst · PosInfInterval · PosInfIntervalRange · PosixTimeZone · setTZEnvVar · SimpleTimeZone · stdTimeToFILETIME · stdTimeToUnixTime · StopWatch · SYSTEMTIMEToSysTime · SysTime · SysTimeToDosFileTime · SysTimeToFILETIME · SysTimeToSYSTEMTIME · TimeOfDay · timeStrings · TimeZone · TZConversions · tzDatabaseNameToWindowsTZName · unixTimeToStdTime · UTC · valid · validTimeUnits · WindowsTimeZone · windowsTZNameToTZDatabaseName · yearIsLeapYear

Модуль, содержащий функциональность работы с датой/временем.
Этот модуль предоставляет:
С модулем std.datetime тесно связан модуль core.time, а некоторые типы времени, используемые в std.datetime, получены оттуда – например, core.time.Duration, core.time.TickDuration, and core.time.FracSec. Модуль core.time публично импортируется в std.datetime, его необязательно импортировать отдельно.
Три основных концепции, используемые в этом модуле, – это временные отметки (time point), длительности (time durations) и временные интервалы (time intervals).
Отметка времени – это конкретный момент времени, например, 5 января 2010 года или 5:00.
Длительность – это протяжённость времени, выраженная в некоторых единицах, например, 5 дней или 231 секунда.
Временной интервал указывает на период времени, связанный с фиксированной точкой во времени. Это либо две отметки времени, связанные друг с другом, означающие время, начинающееся с первой отметки, но не включающее вторую отметку, – например, [5 января 2010 г. - 10 марта 2010 г.), – или это время и длительность, связанные друг с другом, например, 5 января 2010 года и 5 дней, означающие [5 января 2010 года - 10 января 2010 года).
Между временными точками и длительностью поддерживаются различные арифметические операции (например, разница между двумя отметками времени – это длительность), а диапазоны можно получить с помощью временных интервалов, поэтому операции, основанные на диапазонах, можно выполнять на серии отметок времени.
Типы, которые будут интересны обычному пользователю, – это Date (если им нужна дата, но не важно время), DateTime (если им нужны дата и время, но не важны часовые пояса), SysTime (если им нужны дата и время от ОС и/или важны часовые пояса), и StopWatch (платформонезависимый, прецизионный секундомер). Date и DateTime оптимизированы для календарных операций, а SysTime предназначена для работы со временем в ОС. Ознакомьтесь с их конкретной документацией для получения более подробной информации.
Чтобы получить текущее время, используйте Clock.currTime. Эта функция вернёт текущее время в виде SysTime. Чтобы его напечатать, достаточно использовать toString, но если вы используете toISOString, toISOExtString, или toSimpleString, используйте соответствующую фунцию fromISOString, fromISOExtString, или fromSimpleString, чтобы создать SysTime из строки.
auto currentTime = Clock.currTime();
auto timeString = currentTime.toISOExtString();
auto restoredTime = SysTime.fromISOExtString(timeString);
Различные функции принимают строку (или строки) для представления единицы времени (например, convert!("days", "hours")(numDays)). Допустимыми строками для использования с такими функциями являются "years" (годы), "months" (месяцы), "weeks" (недели), "days" (дни), "hours" (часы), "minutes" (минуты), "seconds" (секунды), "msecs" (миллисекунды), "usecs" (микросекунды), "hnsecs" (гекто-наносекунды – то есть 100 нс) или их некоторые подмножества. В core.time существуют несколько функций, которые принимают "nsecs" (наносекунды), но поскольку ничего в std.datetime не имеет точности большей, чем hnsec, и совсем немного в core.time, никакие функции в std.datetime не принимают "nsecs". Чтобы помнить, для каких единиц используется сокращение, а для каких нет: все единицы секунд и большие промежутки времени используют свои полные имена, а все единицы, меньшие, чем секунда, сокращены (поскольку они были бы довольно длинными, если бы это было не так).

Примечание: DateTimeException является псевдонимом для исключения core.time.TimeException, поэтому вам не нужно беспокоиться о том, что функции модулей core.time и std.datetime выбрасывают разные типы исключений (за исключением редкого случая, когда они выбрасывают что-то отличное от core.time.TimeException или DateTimeException).

Смотрите также:
Introduction to std.datetime
ISO 8601
TZ Database
Список часовых поясов по странам
Лицензия:
Boost License 1.0.
Авторы:
Jonathan M Davis и Kato Shoichi

Исходный код: std/datetime.d

Переместиться к: apr · aug · dec · feb · jan · jul · jun · mar · may · nov · oct · sep

enum Month: ubyte;
Представляет 12 месяцев григорианского года (январь - это 1).
jan
январь
feb
февраль
mar
март
apr
апрель
may
май
jun
июнь
jul
июнь
aug
август
sep
сентябрь
oct
октябрь
nov
ноябрь
dec
декабрь

Переместиться к: fri · mon · sat · sun · thu · tue · wed

enum DayOfWeek: ubyte;
Представляет 7 дней григорианской недели (воскресенье - это 0).
sun
воскресенье
mon
понедельник
tue
вторник
wed
среда
thu
четверг
fri
пятница
sat
суббота
alias AllowDayOverflow = std.typecons.Flag!"allowDayOverflow".Flag;
В некоторых расчетах, связанных с датами, добавление месяцев или лет может привести к тому, что дата попадёт на день месяца, который окажется недействительным (например, 29 февраля 2001 года или 31 июня 2000 года). Если переполнение (overflow) разрешено (как это установлено по-умолчанию), то месяц соответственным образом увеличится (так, 29 февраля 2001 года станет 1 марта 2001 года, а 31 июня 2000 года станет 1 июля 2000 года). Если переполнение не разрешено, то день будет установлен на последний существующий день в этом месяце (так, 29 февраля 2001 года станет 28 февраля 2001 года и 31 июня 2000 года станет 30 июня 2000 года).
AllowDayOverflow применим только к расчетам, связанным с месяцами или годами.
Если задано значение AllowDayOverflow.no, тогда переполнение не допускается.
В противном случае, если установлено значение AllowDayOverflow.yes, тогда переполнение допустимо.

Переместиться к: both · bwd · fwd

enum Direction: int;
Указывает направление во времени. Одним из примеров его использования является функция expand структуры Interval, в которой Direction используется для указания того, должен ли интервал расширяться назад (в прошлое), вперёд (в будущее) или в обе стороны.
bwd
Назад.
fwd
Вперёд.
both
Назад и вперёд.
alias PopFirst = std.typecons.Flag!"popFirst".Flag;
Используется для указания того, следует ли сразу вызвать popFront при создании диапазона. Идея заключается в том, что для некоторых функций, используемых для создания диапазона-интервала, первое значение front не обязательно будет тем моментом времени, который должен генерировать диапазон. Чтобы получить первую отметку времени в диапазоне в соответствии с тем, что генерирует функция, используйте PopFirst.yes, чтобы указать, что в диапазоне должен быть вызван popFront до того, как диапазон первый раз возвратит front в качестве отметки времени, которую должна генерировать функция.
Например, если функция, используемая для создания диапазона отметок времени, генерирует последовательные даты Пасхи (т.е. диапазон выполняет итерацию по всем датам Пасхи внутри интервала), первоначальная дата, вероятно, не является Пасхой. Использование PopFirst.yes сообщило бы функции, возвращающей диапазон, что нужно вызвать popFront, чтобы следующее значение front, сгенерированное функцией, стало датой Пасхи. Если используется PopFirst.no, то front остался бы исходной отметкой времени, а это может и не быть одним из тех моментов, которые генерируются функцией создания диапазона (но часто это является желательным поведением, например, в случае простой итерации по каждому дню от начала интервала).
Если установлено значение PopFirst.no, то popFront не будет вызываться перед возвратом диапазона.
В противном случае, если установлено значение PopFirst.yes, то перед возвратом диапазона вызывается popFront.
alias AutoStart = std.typecons.Flag!"autoStart".Flag;
Используется в StopWatch, чтобы указать, следует ли начинать сразу после построения.
Если установлено значение AutoStart.no, секундомер не запускается при создании.
В противном случае, если установлено значение AutoStart.yes, секундомер запустится сразу после создания.
immutable string[] timeStrings;
Массив строк, представляющих единицы времени, начиная с наименьшей единицы и двигаясь к самому большому. В него не входит "nsecs".
Включает "hnsecs" (гекто-наносекунды (100 нс)), "usecs" (микросекунды), "msecs" (миллисекунды), "seconds" (секунды), "minutes" (минуты), "hours" (часы), "days" (дни), "weeks" (недели), "months" (месяцы), и "years" (годы).
alias DateTimeException = core.time.TimeException;
Тип исключения, используемый в std.datetime. Это псевдоним для core.time.TimeException. Любое из них можно ловить, не заботясь о том, из какого модуля оно пришло.

Переместиться к: currAppTick · currStdTime · currSystemTick · currTime

class Clock;
Эффективное пространство имен, для понимания, что содержащиеся в нём методы получают время от системных часов. Запрещено создание экземпляра.
@safe SysTime currTime(ClockType clockType = ClockType.normal)(immutable TimeZone tz = LocalTime());
Возвращает текущее время в данном часовом поясе.
Parameters:
clockType core.time.ClockType указывает, какие системные часы использовать для получения текущего времени. Очень немногим программам понадобится использовать что-либо вместо значения по умолчанию.
TimeZone tz Временной пояс для возвращаемого времени SysTime.
Исключения:
DateTimeException, если получить время не удалось.
@property @trusted long currStdTime(ClockType clockType = ClockType.normal)();
Возвращает количество hnsecs (гекто-наносекунд или 100 наносекунд) от полуночи, 1 января, 1 года н. э. до текущего момента.
Parameters:
clockType core.time.ClockType указывает, какие системные часы использовать для получения текущего времени. Очень немногим программам понадобится использовать что-либо вместо значения по умолчанию.
Исключения:
DateTimeException, если получить время не удалось.
deprecated static nothrow @property @safe TickDuration currSystemTick();
Устаревшее. core.time.TickDuration устарело в пользу core.time.MonoTime. Вместо этой функции используйте MonoTime.currTime. currSystemTick будет удалена в январе 2017 года.
Текущий номер тика системы. Количество тиков в секунду варьируется от системы к системе. currSystemTick использует монотонные часы, поэтому он предназначен для точной синхронизации, сравнивая относительные значения времени, он не предназначен для получения текущего системного времени.

Предупреждение: В некоторых системах монотонные часы могут перестать отсчитывать время, когда компьютер перейдёт в спящий режим или в гибернацию. Таким образом, если это произойдет, монотонные часы могут указывать на меньшее время, чем прошло фактически. Известно, что так происходит в Mac OS X. Не проверялось, происходит ли это в Windows или Linux.

Исключения:
DateTimeException, если получить время не удалось.
deprecated static @property @safe TickDuration currAppTick();
Устаревшее. core.time.TickDuration устарело в пользу core.time.MonoTime. Чтобы дублировать поведение currAppTick с помощью MonoTime, сохраните значение MonoTime.currTime, когда программа запустится, а затем вычтите его из текущего значения MonoTime.currTime для определения, как долго работала программа. currAppTick будет удалена в январе 2017 года.
immutable MonoTime startupTime;
shared static this()
{
    startupTime = MonoTime.currTime;
}
Duration timeSinceProgramStarted()
{
    return MonoTime.currTime - startupTime;
}
Текущее количество системных тиков с момента запуска приложения. Количество тиков в секунду варьируется от системы к системе. Используются монотонные часы.

Предупреждение: В некоторых системах монотонные часы могут перестать отсчитывать время, когда компьютер перейдёт в спящий режим или в гибернацию. Таким образом, если это произойдет, монотонные часы могут указывать на меньшее время, чем прошло фактически. Известно, что так происходит в Mac OS X. Не проверялось, происходит ли это в Windows или Linux.

Исключения:
DateTimeException, если получить время не удалось.
struct SysTime;
SysTime — это тип, используемый для получения текущего времени от системы или для выполнения действий, связанных с часовыми поясами. В отличие от DateTime, часовой пояс является неотъемлемой частью SysTime (хотя для приложений местного времени часовые пояса можно игнорировать, и они будут работать, поскольку по умолчанию используется локальный часовой пояс). Он хранит свое внутреннее время в виде std time (количество hnsecs от полуночи, 1 января, 1 года н. э. UTC), поэтому он хорошо взаимодействует с системным временем. Однако это означает, что, в отличие от DateTime, он не оптимизирован для календарных операций, и получение отдельных единиц из него, таких как годы или дни, будет использовать преобразования и окажется менее эффективным.
Для календарных операций, в которых не важны часовые пояса, используйте тип DateTime. Для системного времени используйте SysTime.
Clock.currTime вернёт текущее время в виде SysTime. Чтобы преобразовать SysTime в Date или в DateTime, просто выполните cast. Чтобы преобразовать Date или DateTime в SysTime, используйте конструктор SysTime и передайте его в предполагаемый часовой пояс (или не передавайте TimeZone, и будет использоваться местный часовой пояс). Имейте в виду, однако, что переход от DateTime к SysTime не обязательно будет на 100% точным из-за переходов на летнее/зимнее время (в оригинальном тексте было DST, или Daylight saving time – прим.пер.) (один час года не существует, а другой имеет место дважды). Чтобы не рисковать никакими ошибками преобразования, храните время в виде SysTime. Помимо DST, не должно быть никаких проблем с преобразованиями.
Для использования часовых поясов, отличных от местного времени или UTC, используйте PosixTimeZone в системах Posix (или в Windows, если предоставляются файлы базы данных TZ), и используйте WindowsTimeZone для Windows-систем. Время в SysTime внутренне хранится в виде количества hnsecs, начиная с полуночи, 1 января, 1 года н.э. UTC. Ошибка преобразования не может произойти при изменении часового пояса в SysTime. LocalTime – это подкласс TimeZone, который представляет локальное время, а UTC – это подкласс TimeZone, который представляет собой UTC. SysTime использует LocalTime, если не предоставляется TimeZone. Подробнее о часовых поясах смотрите в документации о TimeZone, PosixTimeZone, и WindowsTimeZone.
Диапазон допустимых значений SysTime приблизительно находится в пределах от 29 000 лет до н.э до 29 000 лет н.э.

Переместиться к: 2 · 3 · 4

nothrow @safe this(in DateTime dateTime, immutable TimeZone tz = null);
Parameters:
DateTime dateTime DateTime, используемый для установки std time внутри этого SysTime. Поскольку DateTime понятия не имеет о часовом поясе, в качестве часового пояса используется tz.
TimeZone tz TimeZone, используемый для этого SysTime. Если равно null, будет использоваться LocalTime. Предполагается, что переданный DateTime находится в данном часовом поясе.
@safe this(in DateTime dateTime, in Duration fracSecs, immutable TimeZone tz = null);
Parameters:
DateTime dateTime DateTime, используемый для установки std time внутри этого SysTime. Поскольку DateTime понятия не имеет о часовом поясе, в качестве часового пояса используется tz.
Duration fracSecs Часть времени, составляющая дробную часть секунды.
TimeZone tz TimeZone, используемый для этого SysTime. Если равно null, будет использоваться LocalTime. Предполагается, что переданный DateTime находится в данном часовом поясе.
Исключения:
DateTimeException, если fracSecs отрицательно, или если больше или равно 1 секунде.
nothrow @safe this(in Date date, immutable TimeZone tz = null);
Parameters:
Date date Date, используемый для установки std time внутри этого SysTime. Поскольку Date понятия не имеет о часовом поясе, в качестве часового пояса используется tz.
TimeZone tz TimeZone, используемый для этого SysTime. Если равно null, будет использоваться LocalTime. Предполагается, что переданный Date находится в данном часовом поясе.
pure nothrow @safe this(long stdTime, immutable TimeZone tz = null);

Замечание: В то время как другие конструкторы принимают передаваемое им значение даты/времени, предполагая, что оно соответствует переданному Часовому поясу, и преобразуют его в количество hnsecs в UTC, прошедшее от полуночи, 1 января, 1 года н.э. по Гринвичу, т. е. std time – этот конструктор принимает std time, которое уже задано в UTC, так что никакого преобразования не происходит. Конечно, различные геттер-свойства и функции будут использовать преобразующую функцию данного часового пояса для преобразования результатов в этот Часовой пояс, но никакого преобразования аргументов в этом конструкторе не происходит.

Parameters:
long stdTime Количество hnsecs, начиная от полуночи, 1 января, 1 года н.э. по Гринвичу.
TimeZone tz TimeZone, используемый для этого SysTime. Если равно null, то будет использоваться LocalTime.

Переместиться к: 2

pure nothrow ref return @safe SysTime opAssign(ref const SysTime rhs);
Parameters:
SysTime rhs SysTime, присваиваемое этому экземпляру.
pure nothrow ref return @safe SysTime opAssign(SysTime rhs);
Parameters:
SysTime rhs SysTime, присваиваемое этому экземпляру.
const pure nothrow @safe bool opEquals(const SysTime rhs);

const pure nothrow @safe bool opEquals(ref const SysTime rhs);
Проверяет равенство между этим SysTime и переданным SysTime.
Обратите внимание, что часовой пояс игнорируется. Сравниваются только внутренние значения std time (которые находятся в формате UTC).
const pure nothrow @safe int opCmp(in SysTime rhs);
Сравнивает этот SysTime с переданным SysTime.
Часовой пояс не имеет значения при сравнении значений SysTime.
Возвращает:
this < rhs < 0
this == rhs 0
this > rhs > 0
const pure nothrow @nogc @safe size_t toHash();
Возвращает:
хэш от значения этого SysTime

Переместиться к: 2

const nothrow @property @safe short year();
Год Григорианского календаря. Положительные цифры – Наша Эра, неположительные – До Нашей Эры.
Примеры:
assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).year == 1999);
assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).year == 2010);
assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).year == -7);
@property @safe void year(int year);
Присвоить год Григорианского календаря. Положительные цифры – Наша Эра, неположительные – До Нашей Эры.
Parameters:
int year Год, который нужно установить в этом значении SysTime.
Исключения:
DateTimeException, если новое значение year не соответсвует високосному году, а результирующая дата будет 29 февраля.

Переместиться к: 2

const @property @safe ushort yearBC();
Год до н. э. по григорианскому календарю, считая год 0 первым годом до н. э.
Исключения:
DateTimeException, если isAD равно true.
Примеры:
assert(SysTime(DateTime(0, 1, 1, 12, 30, 33)).yearBC == 1);
assert(SysTime(DateTime(-1, 1, 1, 10, 7, 2)).yearBC == 2);
assert(SysTime(DateTime(-100, 1, 1, 4, 59, 0)).yearBC == 101);
@property @safe void yearBC(int year);
Присвоить год до н. э. по григорианскому календарю, считая год 0 первым годом до н. э.
Parameters:
int year Год до Нашей Эры, который нужно установить в этом значении SysTime.
Исключения:
DateTimeException, если получено неположительное значение.

Переместиться к: 2

const nothrow @property @safe Month month();
Месяц Григорианского календаря.
Примеры:
assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).month == 7);
assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).month == 10);
assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).month == 4);
@property @safe void month(Month month);
Присвоить месяц Григорианского календаря.
Parameters:
Month month Месяц, который нужно установить в этом значении SysTime.
Исключения:
DateTimeException, если полученное значение month не является допустимым значением месяца.

Переместиться к: 2

const nothrow @property @safe ubyte day();
День месяца Григорианского календаря.
Примеры:
assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).day == 6);
assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).day == 4);
assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).day == 5);
@property @safe void day(int day);
Присвоить день месяца Григорианского календаря.
Parameters:
int day День месяца, который нужно установить в этом значении SysTime.
Исключения:
DateTimeException, если переданное значение day не является допустимым днём текущего месяца.

Переместиться к: 2

const nothrow @property @safe ubyte hour();
Час после полнуночи.
@property @safe void hour(int hour);
Присвоить час после полнуночи.
Parameters:
int hour Значение часа, которое нужно установить в этом SysTime.
Исключения:
DateTimeException, если переданное значение hour не является допустимым часом дня.

Переместиться к: 2

const nothrow @property @safe ubyte minute();
Значение минут текущего часа.
@property @safe void minute(int minute);
Присвоить значение минут текущего часа.
Parameters:
int minute Значение минут, которое нужно установить в этом SysTime.
Исключения:
DateTimeException, если переданное значение minute не является допустимой минутой в часе.

Переместиться к: 2

const nothrow @property @safe ubyte second();
Значение секунд текущей минуты.
@property @safe void second(int second);
Присвоить значение секунд текущей минуты.
Parameters:
int second Значение секунд, которое нужно установить в этом SysTime.
Исключения:
DateTimeException, если переданное значение second не является допустимой секундой в минуте.

Переместиться к: 2

const nothrow @property @safe Duration fracSecs();
Дробная часть секунды после начала секунды (т.е. часть SysTime, которая меньше секунды).
Примеры:
auto dt = DateTime(1982, 4, 1, 20, 59, 22);
assert(SysTime(dt, msecs(213)).fracSecs == msecs(213));
assert(SysTime(dt, usecs(5202)).fracSecs == usecs(5202));
assert(SysTime(dt, hnsecs(1234567)).fracSecs == hnsecs(1234567));

// И SysTime, и Duration имеют точность hnsecs (100 нс),
// так что nsecs (наносекунды) будут усечены.
assert(SysTime(dt, nsecs(123456789)).fracSecs == nsecs(123456700));
@property @safe void fracSecs(Duration fracSecs);
Присвоить дробную часть секунды после начала секунды (т.е. часть SysTime, которая меньше секунды).
Параметры:
Duration fracSecs Длительность, задающая дробную часть секунды в SysTime.
Исключения:
DateTimeException, если переданная длительность отрицательна или больше или равна одной секунде.
Примеры:
auto st = SysTime(DateTime(1982, 4, 1, 20, 59, 22));
assert(st.fracSecs == Duration.zero);

st.fracSecs = msecs(213);
assert(st.fracSecs == msecs(213));

st.fracSecs = hnsecs(1234567);
assert(st.fracSecs == hnsecs(1234567));

// И SysTime имеет точность hnsecs (100 нс),
// так что nsecs (наносекунды) будут усечены.
st.fracSecs = nsecs(123456789);
assert(st.fracSecs == hnsecs(1234567));

Переместиться к: 2

const pure nothrow @property @safe long stdTime();
Количество hnsecs, прошедших с полуночи, 1 января, 1 года н.э. UTC (по Гринвичу). Это внутреннее представление SysTime.
pure nothrow @property @safe void stdTime(long stdTime);
Присвоить количество hnsecs, прошедших с полуночи, 1 января, 1 года н.э. UTC (по Гринвичу). Это внутреннее представление SysTime.
Параметры:
long stdTime Количество hnsecs, прошедших с полуночи, 1 января, 1 года н.э. UTC.

Переместиться к: 2

const pure nothrow @property @safe immutable(TimeZone) timezone();
Текущий часовой пояс этого SysTime. Его внутреннее время всегда хранится в UTC, поэтому нет проблем с преобразованием между часовыми поясами из-за DST. Функции, которые возвращают всё время или его часть – такую, как количество часов – переводят время к часовому поясу этого SysTime перед возвратом результата.
pure nothrow @property @safe void timezone(immutable TimeZone timezone);
Присвоить текущий часовой пояс этого SysTime. Его внутреннее время всегда хранится в UTC, поэтому нет проблем с преобразованием между часовыми поясами из-за DST. Функции, которые возвращают всё время или его часть – такую, как количество часов – переводят время к часовому поясу этого SysTime перед возвратом результата.
Параметры:
TimeZone timezone Значение TimeZone для присвоения часовому поясу этого SysTime.
const nothrow @property @safe bool dstInEffect();
Возвращает, действует ли DST (летнее время) для этого SysTime.
const nothrow @property @safe Duration utcOffset();
Возвращает, величину смещения от UTC для этого SysTime. Включает в себя смещение DST, действующее на этот момент (если есть).
const pure nothrow @safe SysTime toLocalTime();
Возвращает экземпляр SysTime с тем же значением std time, которое имеется у исходного, но со значением LocalTime в качестве его часового пояса.
const pure nothrow @safe SysTime toUTC();
Возвращает экземпляр SysTime с тем же значением std time, которое имеется у исходного, но с часовым поясом UTC.
const pure nothrow @safe SysTime toOtherTZ(immutable TimeZone tz);
Возвращает экземпляр SysTime с тем же значением std time, которое имеется у исходного, но с переданным значением tz в качестве его часового пояса.
const pure nothrow @safe T toUnixTime(T = time_t)()
if (is(T == int) || is(T == long));
Преобразует этот SysTime в unix-время (т. е. количество прошедших секунд, начиная с полуночи, 1 января 1970 года в UTC).
В стандарте C не указывается представление time_t, поэтому он определяется реализацией. В системах POSIX unix-время эквивалентно time_t, но это не обязательно верно для других систем (например, это неверно для среды исполнения Digital Mars C). Поэтому будьте осторожны при использовании unix-времени с функциями C в системах, отличных от POSIX.
По умолчанию возвращаемым типом является time_t (который обычно является псевдонимом для int в 32-разрядных системах и long в 64-битных системах), но если требуется размер, отличающийся от int или long, его можно передать в виде аргумента шаблона для получения желаемого размера.
Если тип возвращаемого значения – это int, и результат не может поместиться в int, тогда будет использоваться самое близкое значение, которое может быть сохранено в 32 битах (т.е., int.max, если он превышен, и int.min, если результат ещё меньше). Однако не предпринимается никаких попыток справиться с переполнением целых чисел, если тип возврата long.
Параметры:
T Тип возвращаемого значения (int или long). По умолчанию используется значение time_t, которое обычно составляет 32 бита в 32-разрядной системе и 64 бита в 64-разрядной системе.
Возвращает:
Знаковое целое число, представляющее unix-время, которое эквивалентно этому SysTime.
Примеры:
assert(SysTime(DateTime(1970, 1, 1), UTC()).toUnixTime() == 0);

auto pst = new immutable SimpleTimeZone(hours(-8));
assert(SysTime(DateTime(1970, 1, 1), pst).toUnixTime() == 28800);

auto utc = SysTime(DateTime(2007, 12, 22, 8, 14, 45), UTC());
assert(utc.toUnixTime() == 1_198_311_285);

auto ca = SysTime(DateTime(2007, 12, 22, 8, 14, 45), pst);
assert(ca.toUnixTime() == 1_198_340_085);
static pure nothrow @safe SysTime fromUnixTime(long unixTime, immutable TimeZone tz = LocalTime());
Преобразует из unix-времени (то есть, количества секунд, начиная с полуночи, 1 января 1970 года в UTC) в SysTime.
В стандарте C не указывается представление time_t, поэтому он определяется реализацией. В системах POSIX unix-время эквивалентно time_t, но это не обязательно верно для других систем (например, это неверно для среды исполнения Digital Mars C). Поэтому будьте осторожны при использовании unix-времени с функциями C в системах, отличных от POSIX.
Параметры:
long unixTime Количество секунд, начиная с полуночи, 1 января 1970 года в UTC
TimeZone tz Часовой пояс для возвращаемого значения SysTime.
Примеры:
assert(SysTime.fromUnixTime(0) ==
       SysTime(DateTime(1970, 1, 1), UTC()));

auto pst = new immutable SimpleTimeZone(hours(-8));
assert(SysTime.fromUnixTime(28800) ==
       SysTime(DateTime(1970, 1, 1), pst));

auto st1 = SysTime.fromUnixTime(1_198_311_285, UTC());
assert(st1 == SysTime(DateTime(2007, 12, 22, 8, 14, 45), UTC()));
assert(st1.timezone is UTC());
assert(st1 == SysTime(DateTime(2007, 12, 22, 0, 14, 45), pst));

auto st2 = SysTime.fromUnixTime(1_198_311_285, pst);
assert(st2 == SysTime(DateTime(2007, 12, 22, 8, 14, 45), UTC()));
assert(st2.timezone is pst);
assert(st2 == SysTime(DateTime(2007, 12, 22, 0, 14, 45), pst));
const pure nothrow @safe timeval toTimeVal();
Возвращает timeval, которое представляет этот SysTime.
Обратите внимание, что, как и все преобразования в std.datetime, это усекающее преобразование.
Если типом timeval.tv_sec является int, и результат не может поместиться в int, то для tv_sec будет использоваться ближайшее значение, которое может быть сохранено в 32 битах (т.е. int.max, если результат больше, и int.min, если результат меньше).
const pure nothrow @safe timespec toTimeSpec();
Возвращает timespec, который представляет этот SysTime.
Функция только для Posix-систем.
const nothrow @safe tm toTM();
Возвращает tm, который представляет этот SysTime.
nothrow ref @safe SysTime add(string units)(long value, AllowDayOverflow allowOverflow = Yes.allowDayOverflow)
if (units == "years" || units == "months");
Прибавляет заданное количество лет или месяцев к этому SysTime. Отрицательное число будет вычитаться.
Обратите внимание, что если разрешено day overflow (переполнение дня), а дата с изменённым годом/месяцем переполняет количество дней в новом месяце, то месяц увеличится на единицу, а день будет установлен на количество переполнения (например, если день был 31, а новый месяц – июнь, то месяц будет увеличен до июля, а новый день будет 1). Если day overflow не разрешено, то день будет установлен на последний действительный день того же месяца (например, 31 июня станет 30 июня).
Параметры:
units Тип добавляемых единиц ("years" или "months").
long value Количество месяцев или лет для добавления к этому SysTime.
AllowDayOverflow allowOverflow Допустимо ли переполнение дней, что заставит увеличиться месяц.

Переместиться к: 2

nothrow ref @safe SysTime roll(string units)(long value, AllowDayOverflow allowOverflow = Yes.allowDayOverflow)
if (units == "years");
Добавляет заданное количество лет или месяцев к этому SysTime. Отрицательное число будет вычитаться.
Разница между roll и add заключается в том, что roll не влияет на более крупные единицы. roll с добавлением 12 месяцев, применённый к SysTime, даст в результате тот же самый SysTime. Тем не менее, дни могут измениться из-за различного количества дней в каждом месяце.
Поскольку нет единиц больших, чем годы, то нет никакой разницы между add и roll с параметром "years".
Параметры:
units Тип добавляемых единиц ("years" или "months").
long value Количество месяцев или лет для добавления к этому SysTime.
AllowDayOverflow allowOverflow Допустимо ли переполнение дней, что заставит увеличиться месяц.
Примеры:
auto st1 = SysTime(DateTime(2010, 1, 1, 12, 33, 33));
st1.roll!"months"(1);
assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 33, 33)));

auto st2 = SysTime(DateTime(2010, 1, 1, 12, 33, 33));
st2.roll!"months"(-1);
assert(st2 == SysTime(DateTime(2010, 12, 1, 12, 33, 33)));

auto st3 = SysTime(DateTime(1999, 1, 29, 12, 33, 33));
st3.roll!"months"(1);
assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 33, 33)));

auto st4 = SysTime(DateTime(1999, 1, 29, 12, 33, 33));
st4.roll!"months"(1, No.allowDayOverflow);
assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 33, 33)));

auto st5 = SysTime(DateTime(2000, 2, 29, 12, 30, 33));
st5.roll!"years"(1);
assert(st5 == SysTime(DateTime(2001, 3, 1, 12, 30, 33)));

auto st6 = SysTime(DateTime(2000, 2, 29, 12, 30, 33));
st6.roll!"years"(1, No.allowDayOverflow);
assert(st6 == SysTime(DateTime(2001, 2, 28, 12, 30, 33)));
nothrow ref @safe SysTime roll(string units)(long value)
if (units == "days");
Добавляет заданное количество единиц к этому SysTime. Отрицательное число будет вычитаться.
Разница между roll и add заключается в том, что roll не влияет на более крупные единицы. Например, при применении roll к SysTime на количество дней, составляющих один год, получится тот же самый SysTime.
Принимаются следующие единицы: "days", "minutes", "hours", "minutes", "seconds", "msecs", "usecs" и "hnsecs".
Обратите внимание, что для roll с параметрами msecs, usecs или hnsecs, верхним пределом будет секунда. Так, например, roll 100 мсек будет тем же самым, что и roll 100 000 мкс.
Параметры:
units Добавляемые единицы.
long value Количество единиц для добавления к этому SysTime.
Примеры:
auto st1 = SysTime(DateTime(2010, 1, 1, 11, 23, 12));
st1.roll!"days"(1);
assert(st1 == SysTime(DateTime(2010, 1, 2, 11, 23, 12)));
st1.roll!"days"(365);
assert(st1 == SysTime(DateTime(2010, 1, 26, 11, 23, 12)));
st1.roll!"days"(-32);
assert(st1 == SysTime(DateTime(2010, 1, 25, 11, 23, 12)));

auto st2 = SysTime(DateTime(2010, 7, 4, 12, 0, 0));
st2.roll!"hours"(1);
assert(st2 == SysTime(DateTime(2010, 7, 4, 13, 0, 0)));

auto st3 = SysTime(DateTime(2010, 2, 12, 12, 0, 0));
st3.roll!"hours"(-1);
assert(st3 == SysTime(DateTime(2010, 2, 12, 11, 0, 0)));

auto st4 = SysTime(DateTime(2009, 12, 31, 0, 0, 0));
st4.roll!"minutes"(1);
assert(st4 == SysTime(DateTime(2009, 12, 31, 0, 1, 0)));

auto st5 = SysTime(DateTime(2010, 1, 1, 0, 0, 0));
st5.roll!"minutes"(-1);
assert(st5 == SysTime(DateTime(2010, 1, 1, 0, 59, 0)));

auto st6 = SysTime(DateTime(2009, 12, 31, 0, 0, 0));
st6.roll!"seconds"(1);
assert(st6 == SysTime(DateTime(2009, 12, 31, 0, 0, 1)));

auto st7 = SysTime(DateTime(2010, 1, 1, 0, 0, 0));
st7.roll!"seconds"(-1);
assert(st7 == SysTime(DateTime(2010, 1, 1, 0, 0, 59)));

auto dt = DateTime(2010, 1, 1, 0, 0, 0);
auto st8 = SysTime(dt);
st8.roll!"msecs"(1);
assert(st8 == SysTime(dt, msecs(1)));

auto st9 = SysTime(dt);
st9.roll!"msecs"(-1);
assert(st9 == SysTime(dt, msecs(999)));

auto st10 = SysTime(dt);
st10.roll!"hnsecs"(1);
assert(st10 == SysTime(dt, hnsecs(1)));

auto st11 = SysTime(dt);
st11.roll!"hnsecs"(-1);
assert(st11 == SysTime(dt, hnsecs(9_999_999)));

Переместиться к: 2 · 3

const pure nothrow @safe SysTime opBinary(string op)(Duration duration)
if (op == "+" || op == "-");
Дает результат добавления или вычитания core.time.Duration из этого SysTime.
Допустимые типы арифметики для SysTime с использованием этого оператора:
SysTime + Duration --> SysTime
SysTime - Duration --> SysTime
Параметры:
Duration duration Экземпляр core.time.Duration для добавления или вычитания из этого SysTime.
Примеры:
assert(SysTime(DateTime(2015, 12, 31, 23, 59, 59)) + seconds(1) ==
       SysTime(DateTime(2016, 1, 1, 0, 0, 0)));

assert(SysTime(DateTime(2015, 12, 31, 23, 59, 59)) + hours(1) ==
       SysTime(DateTime(2016, 1, 1, 0, 59, 59)));

assert(SysTime(DateTime(2016, 1, 1, 0, 0, 0)) - seconds(1) ==
       SysTime(DateTime(2015, 12, 31, 23, 59, 59)));

assert(SysTime(DateTime(2016, 1, 1, 0, 59, 59)) - hours(1) ==
       SysTime(DateTime(2015, 12, 31, 23, 59, 59)));
const pure nothrow @safe SysTime opBinary(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы + и - с типом core.time.TickDuration.

Переместиться к: 2

pure nothrow ref @safe SysTime opOpAssign(string op)(Duration duration)
if (op == "+" || op == "-");
Получить результат прибавления или вычитания core.time.Duration из этого SysTime, и присвоить результат этому SysTime.
Допустимые типы арифметики для SysTime с использованием этого оператора:
SysTime + Duration --> SysTime
SysTime - Duration --> SysTime
Параметры:
Экземпляр core.time.Duration для добавления или вычитания из этого SysTime.
pure nothrow ref @safe SysTime opOpAssign(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы += и -= с типом core.time.TickDuration.
const pure nothrow @safe Duration opBinary(string op)(in SysTime rhs)
if (op == "-");
Дает разницу между двумя экземплярами SysTime.
Допустимые типы арифметики для SysTime с использованием этого оператора:
SysTime - SysTime --> duration
const nothrow @safe int diffMonths(in SysTime rhs);
Возвращает разницу между двумя экземплярами SysTime в месяцах.
Чтобы получить разницу в годах, вычтите свойства year двух экземпляров SysTime. Чтобы получить разницу в днях или неделях, вычтите сами экземпляры SysTime и используйте результат в виде core.time.Duration. Поскольку для конвертации между месяцами и меньшими единицами требуется определённая дата (которой нет у core.time.Duration), получение разницы в месяцах требует некоторой математики, использующей как свойства года, так и месяца, так что это удобная функция для получения разницы в месяцах.
Обратите внимание, что количество дней в месяцах или то, как далеко даты находятся от начала месяца, не имеет значения. Это разница в свойствах month в комбинации с разницей свойств years, умноженной на 12. Так, например, между 31 декабря и 1 января будет разница в один месяц, так же, как между 1 декабря и 31 января – тоже один месяц.
Параметры:
SysTime rhs Экземпляр SysTime, вычитаемый из этого SysTime.
Примеры:
assert(SysTime(Date(1999, 2, 1)).diffMonths(
            SysTime(Date(1999, 1, 31))) == 1);

assert(SysTime(Date(1999, 1, 31)).diffMonths(
            SysTime(Date(1999, 2, 1))) == -1);

assert(SysTime(Date(1999, 3, 1)).diffMonths(
            SysTime(Date(1999, 1, 1))) == 2);

assert(SysTime(Date(1999, 1, 1)).diffMonths(
            SysTime(Date(1999, 3, 31))) == -2);
const nothrow @property @safe bool isLeapYear();
Является ли год этого SysTime високосным годом.
const nothrow @property @safe DayOfWeek dayOfWeek();
День недели этого SysTime.

Переместиться к: 2

const nothrow @property @safe ushort dayOfYear();
День года этого SysTime.
Примеры:
assert(SysTime(DateTime(1999, 1, 1, 12, 22, 7)).dayOfYear == 1);
assert(SysTime(DateTime(1999, 12, 31, 7, 2, 59)).dayOfYear == 365);
assert(SysTime(DateTime(2000, 12, 31, 21, 20, 0)).dayOfYear == 366);
@property @safe void dayOfYear(int day);
Задать день года.
Параметры:
int day День года, устанавливаемый этому SysTime.

Переместиться к: 2

const nothrow @property @safe int dayOfGregorianCal();
Номер дня по григорианскому календарю этого SysTime.
Примеры:
assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).dayOfGregorianCal == 1);
assert(SysTime(DateTime(1, 12, 31, 23, 59, 59)).dayOfGregorianCal == 365);
assert(SysTime(DateTime(2, 1, 1, 2, 2, 2)).dayOfGregorianCal == 366);

assert(SysTime(DateTime(0, 12, 31, 7, 7, 7)).dayOfGregorianCal == 0);
assert(SysTime(DateTime(0, 1, 1, 19, 30, 0)).dayOfGregorianCal == -365);
assert(SysTime(DateTime(-1, 12, 31, 4, 7, 0)).dayOfGregorianCal == -366);

assert(SysTime(DateTime(2000, 1, 1, 9, 30, 20)).dayOfGregorianCal == 730_120);
assert(SysTime(DateTime(2010, 12, 31, 15, 45, 50)).dayOfGregorianCal == 734_137);
nothrow @property @safe void dayOfGregorianCal(int days);
Задать номер дня по григорианскому календарю этого SysTime. Установка этого свойства не влияет на часть SysTime, относящуюся ко времени.
Параметры:
int days номер дня по григорианскому календарю для присвоения этому SysTime.
Примеры:
auto st = SysTime(DateTime(0, 1, 1, 12, 0, 0));
st.dayOfGregorianCal = 1;
assert(st == SysTime(DateTime(1, 1, 1, 12, 0, 0)));

st.dayOfGregorianCal = 365;
assert(st == SysTime(DateTime(1, 12, 31, 12, 0, 0)));

st.dayOfGregorianCal = 366;
assert(st == SysTime(DateTime(2, 1, 1, 12, 0, 0)));

st.dayOfGregorianCal = 0;
assert(st == SysTime(DateTime(0, 12, 31, 12, 0, 0)));

st.dayOfGregorianCal = -365;
assert(st == SysTime(DateTime(-0, 1, 1, 12, 0, 0)));

st.dayOfGregorianCal = -366;
assert(st == SysTime(DateTime(-1, 12, 31, 12, 0, 0)));

st.dayOfGregorianCal = 730_120;
assert(st == SysTime(DateTime(2000, 1, 1, 12, 0, 0)));

st.dayOfGregorianCal = 734_137;
assert(st == SysTime(DateTime(2010, 12, 31, 12, 0, 0)));
const nothrow @property @safe ubyte isoWeek();
Номер недели этого SysTime в соотвествии со стандартом ISO 8601.
Смотрите также:
const nothrow @property @safe SysTime endOfMonth();
SysTime в последний день месяца, в котором находится эта дата. Часть endOfMonth, относящаяся ко времени, всегда равна 23:59:59.9999999.
Примеры:
assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).endOfMonth ==
       SysTime(DateTime(1999, 1, 31, 23, 59, 59),
               hnsecs(9_999_999)));

assert(SysTime(DateTime(1999, 2, 7, 19, 30, 0),
               msecs(24)).endOfMonth ==
       SysTime(DateTime(1999, 2, 28, 23, 59, 59),
               hnsecs(9_999_999)));

assert(SysTime(DateTime(2000, 2, 7, 5, 12, 27),
               usecs(5203)).endOfMonth ==
       SysTime(DateTime(2000, 2, 29, 23, 59, 59),
               hnsecs(9_999_999)));

assert(SysTime(DateTime(2000, 6, 4, 12, 22, 9),
               hnsecs(12345)).endOfMonth ==
       SysTime(DateTime(2000, 6, 30, 23, 59, 59),
               hnsecs(9_999_999)));
const nothrow @property @safe ubyte daysInMonth();
Последний день месяца, в котором находится этот SysTime.
Примеры:
assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).daysInMonth == 31);
assert(SysTime(DateTime(1999, 2, 7, 19, 30, 0)).daysInMonth == 28);
assert(SysTime(DateTime(2000, 2, 7, 5, 12, 27)).daysInMonth == 29);
assert(SysTime(DateTime(2000, 6, 4, 12, 22, 9)).daysInMonth == 30);
const nothrow @property @safe bool isAD();
Является ли текущий год датой, находящейся в Нашей Эре.
Примеры:
assert(SysTime(DateTime(1, 1, 1, 12, 7, 0)).isAD);
assert(SysTime(DateTime(2010, 12, 31, 0, 0, 0)).isAD);
assert(!SysTime(DateTime(0, 12, 31, 23, 59, 59)).isAD);
assert(!SysTime(DateTime(-2010, 1, 1, 2, 2, 2)).isAD);
const nothrow @property @safe long julianDay();
Номер Юлианского дня для этого SysTime в данный момент. Например, до полудня в 1996-03-31 был бы июльский день номер 2_450_173, поэтому эта функция возвращает 2_450_173, а с полудня число юлианских дней будет 2_450_174, поэтому эта функция возвращает 2_450_174.
const nothrow @property @safe long modJulianDay();
Модифицированный юлианский день для любого времени этой даты (так как модифицированный юлианский день меняется в полночь).

Переместиться к: 2 · 3

const nothrow @safe Date opCast(T)()
if (is(Unqual!T == Date));
Возвращает дату Date, эквивалентную этому SysTime.
const nothrow @safe DateTime opCast(T)()
if (is(Unqual!T == DateTime));
Возвращает объект DateTime, эквивалентный этому SysTime.
const nothrow @safe TimeOfDay opCast(T)()
if (is(Unqual!T == TimeOfDay));
Возвращает время TimeOfDay, эквивалентное этому SysTime.
const nothrow @safe string toISOString();
Преобразует этот SysTime в строку с форматом YYYYMMDDTHHMMSS.FFFFFFFTZ (где F - доли секунды, а TZ – часовой пояс).
Обратите внимание, что количество цифр в долях секунды изменяется в зависимости от значения долей секунды. По-максимуму это 7 цифр (только в случае hnsecs), но их будет только такое количество, которое необходимо для хранения правильного значения (так что нет никаких конечных нулей), и если отсутсвуют доли секунды, то нет десятичной точки.
Если часовой пояс этого SysTime является LocalTime, то TZ будет пусто. Если его часовой пояс является UTC, то будет "Z". В противном случае это смещение от UTC (например, +0100 или -0700). Обратите внимание, что информации о смещении от UTC недостаточно для однозначной идентификации часового пояса.
Смещения часовых поясов будут отображаться в форме +HHMM or -HHMM.
Предупреждение: Ранее, функция toISOString выполняла то же самое, что и toISOExtString, и генерировала часовой пояс в формате +HH:MM или -HH:MM , когда он не являлся LocalTime или UTC, что не соответствует стандарту ISO 9601 для формата не-расширенной строки. Теперь это исправлено. Однако, на данный момент fromISOString будет продолжать принимать расширенный формат для часового пояса, так что любой код, который выдал результат toISOString для чтения в дальнейшем, будет продолжать работать.
Примеры:
assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toISOString() ==
       "20100704T070612");

assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0),
               msecs(24)).toISOString() ==
       "19981225T021500.024");

assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toISOString() ==
       "00000105T230959");

assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2),
               hnsecs(520_920)).toISOString() ==
       "-00040105T000002.052092");
const nothrow @safe string toISOExtString();
Преобразует этот SysTime в строку с форматом YYYY-MM-DDTHH:MM:SS.FFFFFFFTZ (где F - доли секунды, а TZ – часовой пояс).
Обратите внимание, что количество цифр в долях секунды изменяется в зависимости от значения долей секунды. По-максимуму это 7 цифр (только в случае hnsecs), но их будет только такое количество, которое необходимо для хранения правильного значения (так что нет никаких конечных нулей), и если отсутсвуют доли секунды, то нет десятичной точки.
Если часовой пояс этого SysTime является LocalTime, то TZ будет пусто. Если его часовой пояс является UTC, то будет "Z". В противном случае это смещение от UTC (например, +01:00 или -07:00). Обратите внимание, что информации о смещении от UTC недостаточно для однозначной идентификации часового пояса.
Смещения часовых поясов будут отображаться в форме +HH:MM или -HH:MM.
Примеры:
assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toISOExtString() ==
       "2010-07-04T07:06:12");

assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0),
               msecs(24)).toISOExtString() ==
       "1998-12-25T02:15:00.024");

assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toISOExtString() ==
       "0000-01-05T23:09:59");

assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2),
               hnsecs(520_920)).toISOExtString() ==
       "-0004-01-05T00:00:02.052092");
const nothrow @safe string toSimpleString();
Преобразует этот SysTime в строку с форматом YYYY-Mon-DD HH:MM:SS.FFFFFFFTZ (где F - доли секунды, а TZ – часовой пояс).
Обратите внимание, что количество цифр в долях секунды изменяется в зависимости от значения долей секунды. По-максимуму это 7 цифр (только в случае hnsecs), но их будет только такое количество, которое необходимо для хранения правильного значения (так что нет никаких конечных нулей), и если отсутсвуют доли секунды, то нет десятичной точки.
Если часовой пояс этого SysTime является LocalTime, то TZ будет пусто. Если его часовой пояс является UTC, то будет "Z". В противном случае это смещение от UTC (например, +01:00 или -07:00). Обратите внимание, что информации о смещении от UTC недостаточно для однозначной идентификации часового пояса.
Смещения часовых поясов будут отображаться в форме +HH:MM или -HH:MM.
Примеры:
assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toSimpleString() ==
       "2010-Jul-04 07:06:12");

assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0),
               msecs(24)).toSimpleString() ==
       "1998-Dec-25 02:15:00.024");

assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toSimpleString() ==
       "0000-Jan-05 23:09:59");

assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2),
               hnsecs(520_920)).toSimpleString() ==
        "-0004-Jan-05 00:00:02.052092");
const nothrow @safe string toString();
Преобразует этот SysTime в строку.
@safe SysTime fromISOString(S)(in S isoString, immutable TimeZone tz = null)
if (isSomeString!S);
Создает SysTime из строки с форматом YYYYMMDDTHHMMSS.FFFFFFFTZ (где F - доли секунды, а TZ – часовой пояс). Пробелы удаляются из заданной строки.
Точный формат точно такой же, как описано в toISOString, за исключением того, что допускаются конечные нули, включая доли секунды со всеми нулями. Однако десятичная точка, за которой ничего не следует, недопустима.
Если в строке не указан часовой пояс, используется LocalTime. Если часовой пояс указан как "Z", то используется UTC. В противном случае используется SimpleTimeZone, который соответствует данному смещению от UTC. Чтобы получить возвращённый SysTime в конкретном часовом поясе, передайте в функцию этот часовой пояс, и возвращаемый SysTime будет преобразован в этот часовой пояс (хотя он все равно будет рассматриваться, как любой часовой пояс в его строке though it will still be read in as whatever time zone is in its string).
Принимаемые форматы для смещения часовых поясов: +HH, -HH, +HHMM и -HHMM.
Предупреждение: Ранее, функция toISOString выполняла то же самое, что и toISOExtString, и генерировала часовой пояс в формате +HH:MM или -HH:MM , когда он не являлся LocalTime или UTC, что не соответствует стандарту ISO 9601 для формата не-расширенной строки. Теперь это исправлено. Однако, на данный момент fromISOString будет продолжать принимать расширенный формат для часового пояса, так что любой код, который выдал результат toISOString для чтения в дальнейшем, будет продолжать работать.
Параметры:
S isoString Строка, отформатированная в формате ISO для даты и времени.
TimeZone tz Часовой пояс для преобразования данного времени (при значении null преобразование не выполняется).
Исключения:
DateTimeException, если данная строка не находится в формате ISO, или если результирующий SysTime недействителен.
@safe SysTime fromISOExtString(S)(in S isoExtString, immutable TimeZone tz = null)
if (isSomeString!S);
Создает SysTime из строки с форматом YYYY-MM-DDTHH:MM:SS.FFFFFFFTZ (где F - доли секунды, а TZ – часовой пояс). Пробелы удаляются из заданной строки.
Точный формат точно такой же, как описано в toISOExtString, за исключением того, что допускаются конечные нули, включая доли секунды со всеми нулями. Однако десятичная точка, за которой ничего не следует, недопустима.
Если в строке не указан часовой пояс, используется LocalTime. Если часовой пояс указан как "Z", то используется UTC. В противном случае используется SimpleTimeZone, который соответствует данному смещению от UTC. Чтобы получить возвращённый SysTime в конкретном часовом поясе, передайте в функцию этот часовой пояс, и возвращаемый SysTime будет преобразован в этот часовой пояс (хотя он все равно будет рассматриваться, как любой часовой пояс в его строке though it will still be read in as whatever time zone is in its string).
Принимаемые форматы для смещения часовых поясов: +HH, -HH, +HH:MM и -HH:MM.
Параметры:
S isoExtString Строка, отформатированная в расширенном формате ISO для даты и времени.
TimeZone tz Часовой пояс для преобразования данного времени (при значении null преобразование не выполняется).
Исключения:
DateTimeException, если данная строка не находится в формате ISO, или если результирующий SysTime недействителен.
@safe SysTime fromSimpleString(S)(in S simpleString, immutable TimeZone tz = null)
if (isSomeString!S);
Создает SysTime из строки с форматом YYYY-Mon-DD HH:MM:SS.FFFFFFFTZ (где F - доли секунды, а TZ – часовой пояс). Пробелы удаляются из заданной строки.
Точный формат точно такой же, как описано в toSimpleString, за исключением того, что допускаются конечные нули, включая доли секунды со всеми нулями. Однако десятичная точка, за которой ничего не следует, недопустима.
Если в строке не указан часовой пояс, используется LocalTime. Если часовой пояс указан как "Z", то используется UTC. В противном случае используется SimpleTimeZone, который соответствует данному смещению от UTC. Чтобы получить возвращённый SysTime в конкретном часовом поясе, передайте в функцию этот часовой пояс, и возвращаемый SysTime будет преобразован в этот часовой пояс (хотя он все равно будет рассматриваться, как любой часовой пояс в его строке though it will still be read in as whatever time zone is in its string).
Принимаемые форматы для смещения часовых поясов: +HH, -HH, +HH:MM и -HH:MM.
Параметры:
S simpleString Строка, отформатированная так, как toSimpleString форматирует даты и время.
TimeZone tz Часовой пояс для преобразования данного времени (при значении null преобразование не выполняется).
Исключения:
DateTimeException, если данная строка не находится в требуемом формате, или если результирующий SysTime недействителен.
static pure nothrow @property @safe SysTime min();
Возвращает самое раннее из всех возможных значений SysTime.
Возвращаемое значение SysTime находится в UTC.
static pure nothrow @property @safe SysTime max();
Возвращает самое позднее из всех возможных значений SysTime.
Возвращаемое значение SysTime находится в UTC.
struct Date;
Представляет дату в Пролептическом григорианском календаре от 32 768 до н.э. до 32 767 н.э. Положительные годы представляют Нашу Эру, неположительные годы – до н.э.
Год, месяц и день хранятся внутри отдельно, так что Date оптимизирована для календарных операций.
Date использует Пролептический григорианский календарь, поэтому он предполагает вычисления григорианского високосного года по всей своей длине. Согласно ISO 8601, он трактует первый год до н.э. как год 0, то есть 1 год до н.э. является 0, второй считается как -1 и т.д. Используйте yearBC для использования исчисления до Нашей Эры в виде положительного целого числа, где 1 год до н.э. считается годом, который был предыдущим перед 1 годом н.э.
Год 0 – високосный год.

Переместиться к: 2

pure @safe this(int year, int month, int day);
Исключения:
DateTimeException, если полученная дата не является допустимой.
Параметры:
int year Год григорианского календаря. Положительные значения – годы Нашей Эры, неположительные значения – годы до н.э., год 0 является 1 годом до н.э.
int month Месяй года.
int day День месяца.
pure nothrow @safe this(int day);
Параметры:
int day День григорианского календаря, на который будет построена Date.
The Xth day of the Gregorian Calendar that the constructed Date will be for.
const pure nothrow @safe int opCmp(in Date rhs);
Сравнивает эту Date с переданной Date.
Возвращает:
this < rhs < 0
this == rhs 0
this > rhs > 0

Переместиться к: 2

const pure nothrow @property @safe short year();
Год григорианского календаря. Положительными являются годы Нашей Эры, неположительными – годы до Нашей Эры.
Примеры:
assert(Date(1999, 7, 6).year == 1999);
assert(Date(2010, 10, 4).year == 2010);
assert(Date(-7, 4, 5).year == -7);
pure @property @safe void year(int year);
Присвоить год григорианского календаря. Положительными являются годы Нашей Эры, неположительными – годы до Нашей Эры.
Параметры:
int year Год для установки года этой Date.
Исключения:
DateTimeException, если полученный год не является високосным годом, а результирующая дата будет 29 февраля.
Примеры:
assert(Date(1999, 7, 6).year == 1999);
assert(Date(2010, 10, 4).year == 2010);
assert(Date(-7, 4, 5).year == -7);

Переместиться к: 2

const pure @property @safe ushort yearBC();
Год григорианского календаря до Нашей Эры, с расчётом, что год 0 является первым годом до н.э.
Исключения:
DateTimeException, если isAD равно true.
Примеры:
assert(Date(0, 1, 1).yearBC == 1);
assert(Date(-1, 1, 1).yearBC == 2);
assert(Date(-100, 1, 1).yearBC == 101);
pure @property @safe void yearBC(int year);
Присвоить год григорианского календаря до Нашей Эры, с расчётом, что год 0 является первым годом до н.э.
Параметры:
int year Год до н.э., присваиваемый этой Date.
Исключения:
DateTimeException, если передано неположительное значение.
Примеры:
auto date = Date(2010, 1, 1);
date.yearBC = 1;
assert(date == Date(0, 1, 1));

date.yearBC = 10;
assert(date == Date(-9, 1, 1));

Переместиться к: 2

const pure nothrow @property @safe Month month();
Месяц григорианского календаря.
Примеры:
assert(Date(1999, 7, 6).month == 7);
assert(Date(2010, 10, 4).month == 10);
assert(Date(-7, 4, 5).month == 4);
pure @property @safe void month(Month month);
Присвоить месяц григорианского календаря.
Параметры:
Month month Значение месяца для присвоения этой Date.
Исключения:
DateTimeException, если переданное значение месяца не является допустимым, или если текущий день недействителен в этом месяце.

Переместиться к: 2

const pure nothrow @property @safe ubyte day();
День месяца григорианского календаря.
Примеры:
assert(Date(1999, 7, 6).day == 6);
assert(Date(2010, 10, 4).day == 4);
assert(Date(-7, 4, 5).day == 5);
pure @property @safe void day(int day);
Присвоить день месяца григорианского календаря.
Параметры:
int day День месяца для установки значения дня этой Date.
Исключения:
DateTimeException, если данный день не является действительным днем текущего месяца.
pure nothrow ref @safe Date add(string units)(long value, AllowDayOverflow allowOverflow = Yes.allowDayOverflow)
if (units == "years");
Добавляет заданное количество лет или месяцев к этой Date. Отрицательное число будет вычитаться.
Обратите внимание, что если разрешено day overflow (переполнение дня), а дата с изменённым годом/месяцем переполняет количество дней в новом месяце, то месяц увеличится на единицу, а день будет установлен на количество переполнения (например, если день был 31, а новый месяц – июнь, то месяц будет увеличен до июля, а новый день будет 1). Если day overflow не разрешено, то день будет установлен на последний действительный день того же месяца (например, 31 июня станет 30 июня).
Параметры:
units Тип единиц для добавления ("years" или "months").
long value Количество месяцев или лет для добавления к этой Date.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня, что может привести к увеличению месяца.
Примеры:
auto d1 = Date(2010, 1, 1);
d1.add!"months"(11);
assert(d1 == Date(2010, 12, 1));

auto d2 = Date(2010, 1, 1);
d2.add!"months"(-11);
assert(d2 == Date(2009, 2, 1));

auto d3 = Date(2000, 2, 29);
d3.add!"years"(1);
assert(d3 == Date(2001, 3, 1));

auto d4 = Date(2000, 2, 29);
d4.add!"years"(1, No.allowDayOverflow);
assert(d4 == Date(2001, 2, 28));

Переместиться к: 2

pure nothrow ref @safe Date roll(string units)(long value, AllowDayOverflow allowOverflow = Yes.allowDayOverflow)
if (units == "years");
Добавляет заданное количество лет или месяцев к этой Date. Отрицательное число будет вычитаться.
Разница между roll и add заключается в том, что roll не влияет на более крупные единицы. roll с добавлением 12 месяцев, применённый к Date, даст в результате ту же самую Date. Тем не менее, дни могут измениться из-за различного количества дней в каждом месяце.
Поскольку нет единиц больших, чем годы, то нет никакой разницы между add и roll с параметром "years".
Параметры:
units Тип единиц для добавления ("years" или "months").
long value Количество месяцев или лет для добавления к этой Date.
AllowDayOverflow allowOverflow Допустимо ли переполнение дней, что заставит увеличиться месяц.
Примеры:
auto d1 = Date(2010, 1, 1);
d1.roll!"months"(1);
assert(d1 == Date(2010, 2, 1));

auto d2 = Date(2010, 1, 1);
d2.roll!"months"(-1);
assert(d2 == Date(2010, 12, 1));

auto d3 = Date(1999, 1, 29);
d3.roll!"months"(1);
assert(d3 == Date(1999, 3, 1));

auto d4 = Date(1999, 1, 29);
d4.roll!"months"(1, No.allowDayOverflow);
assert(d4 == Date(1999, 2, 28));

auto d5 = Date(2000, 2, 29);
d5.roll!"years"(1);
assert(d5 == Date(2001, 3, 1));

auto d6 = Date(2000, 2, 29);
d6.roll!"years"(1, No.allowDayOverflow);
assert(d6 == Date(2001, 2, 28));
pure nothrow ref @safe Date roll(string units)(long days)
if (units == "days");
Добавляет заданное количество единиц к этой Date. Отрицательное число будет вычитаться.
Разница между roll и add заключается в том, что roll не влияет на более крупные единицы. Например, при применении roll к Date на количество дней, составляющих один год, получится та же самая Date.
Единственными допустимыми единицами являются "days" (дни).
Параметры:
units Добавляемые единицы. Должно быть "days".
long days Количество дней, добавляемое к этой Date.
Примеры:
auto d = Date(2010, 1, 1);
d.roll!"days"(1);
assert(d == Date(2010, 1, 2));
d.roll!"days"(365);
assert(d == Date(2010, 1, 26));
d.roll!"days"(-32);
assert(d == Date(2010, 1, 25));

Переместиться к: 2 · 3

const pure nothrow @safe Date opBinary(string op)(Duration duration)
if (op == "+" || op == "-");
Даёт результат добавления или вычитания core.time.Duration из этой Date.
Допустимые типы арифметики для Date с использованием этого оператора:
Date + Duration --> Date
Date - Duration --> Date
Параметры:
Duration duration Экземпляр core.time.Duration для добавления или вычитания из этой Date.
Примеры:
assert(Date(2015, 12, 31) + days(1) == Date(2016, 1, 1));
assert(Date(2004, 2, 26) + days(4) == Date(2004, 3, 1));

assert(Date(2016, 1, 1) - days(1) == Date(2015, 12, 31));
assert(Date(2004, 3, 1) - days(4) == Date(2004, 2, 26));
const pure nothrow @safe Date opBinary(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы + и - с типом core.time.TickDuration.

Переместиться к: 2

pure nothrow ref @safe Date opOpAssign(string op)(Duration duration)
if (op == "+" || op == "-");
Получить результат прибавления или вычитания core.time.Duration из этой Date, и присвоить результат этой Date.
Допустимые типы арифметики для Date с использованием этого оператора:
Date + Duration --> Date
Date - Duration --> Date
Параметры:
Duration duration Экземпляр core.time.Duration для добавления или вычитания из этой Date.
pure nothrow ref @safe Date opOpAssign(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы += и -= с типом core.time.TickDuration.
const pure nothrow @safe Duration opBinary(string op)(in Date rhs)
if (op == "-");
Дает разницу между двумя экземплярами Date.
Допустимые типы арифметики для Date с использованием этого оператора:
Date - Date --> duration
const pure nothrow @safe int diffMonths(in Date rhs);
Возвращает разницу между двумя экземплярами Date в месяцах.
Чтобы получить разницу в годах, вычтите свойства year двух экземпляров Date. Чтобы получить разницу в днях или неделях, вычтите сами экземпляры Date и используйте результат в виде core.time.Duration. Поскольку для конвертации между месяцами и меньшими единицами требуется определённая дата (которой нет у core.time.Duration), получение разницы в месяцах требует некоторой математики, использующей как свойства года, так и месяца, так что это удобная функция для получения разницы в месяцах.
Обратите внимание, что количество дней в месяцах или то, как далеко даты находятся от начала месяца, не имеет значения. Это разница в свойствах month в комбинации с разницей свойств years, умноженной на 12. Так, например, между 31 декабря и 1 января будет разница в один месяц, так же, как между 1 декабря и 31 января – тоже один месяц.
Параметры:
Date rhs Экземпляр Date, вычитаемый из этой Date.
Примеры:
assert(Date(1999, 2, 1).diffMonths(Date(1999, 1, 31)) == 1);
assert(Date(1999, 1, 31).diffMonths(Date(1999, 2, 1)) == -1);
assert(Date(1999, 3, 1).diffMonths(Date(1999, 1, 1)) == 2);
assert(Date(1999, 1, 1).diffMonths(Date(1999, 3, 31)) == -2);
const pure nothrow @property @safe bool isLeapYear();
Является ли год этой Date високосным годом.
const pure nothrow @property @safe DayOfWeek dayOfWeek();
День недели этой Date.

Переместиться к: 2

const pure nothrow @property @safe ushort dayOfYear();
День года этой Date.
Примеры:
assert(Date(1999, 1, 1).dayOfYear == 1);
assert(Date(1999, 12, 31).dayOfYear == 365);
assert(Date(2000, 12, 31).dayOfYear == 366);
pure @property @safe void dayOfYear(int day);
Присвоить день года этой Date.
Параметры:
int day День года, устанавливаемый этой Date.
Исключения:
DateTimeException, если данный день является недопустимым днём года.

Переместиться к: 2

const pure nothrow @property @safe int dayOfGregorianCal();
Номер дня по григорианскому календарю этой Date.
Примеры:
assert(Date(1, 1, 1).dayOfGregorianCal == 1);
assert(Date(1, 12, 31).dayOfGregorianCal == 365);
assert(Date(2, 1, 1).dayOfGregorianCal == 366);

assert(Date(0, 12, 31).dayOfGregorianCal == 0);
assert(Date(0, 1, 1).dayOfGregorianCal == -365);
assert(Date(-1, 12, 31).dayOfGregorianCal == -366);

assert(Date(2000, 1, 1).dayOfGregorianCal == 730_120);
assert(Date(2010, 12, 31).dayOfGregorianCal == 734_137);
pure nothrow @property @safe void dayOfGregorianCal(int day);
Присвоить номер дня по григорианскому календарю этой Date.
Параметры:
int day номер дня по григорианскому календарю для присвоения этой Date.
Примеры:
auto date = Date.init;
date.dayOfGregorianCal = 1;
assert(date == Date(1, 1, 1));

date.dayOfGregorianCal = 365;
assert(date == Date(1, 12, 31));

date.dayOfGregorianCal = 366;
assert(date == Date(2, 1, 1));

date.dayOfGregorianCal = 0;
assert(date == Date(0, 12, 31));

date.dayOfGregorianCal = -365;
assert(date == Date(-0, 1, 1));

date.dayOfGregorianCal = -366;
assert(date == Date(-1, 12, 31));

date.dayOfGregorianCal = 730_120;
assert(date == Date(2000, 1, 1));

date.dayOfGregorianCal = 734_137;
assert(date == Date(2010, 12, 31));
const pure nothrow @property @safe ubyte isoWeek();
Номер недели этой Date в соотвествии со стандартом ISO 8601.
Смотрите также:
const pure nothrow @property @safe Date endOfMonth();
Date в последний день месяца, в котором находится эта Date.
Примеры:
assert(Date(1999, 1, 6).endOfMonth == Date(1999, 1, 31));
assert(Date(1999, 2, 7).endOfMonth == Date(1999, 2, 28));
assert(Date(2000, 2, 7).endOfMonth == Date(2000, 2, 29));
assert(Date(2000, 6, 4).endOfMonth == Date(2000, 6, 30));
const pure nothrow @property @safe ubyte daysInMonth();
Последний день месяца, в котором находится эта Date.
Примеры:
assert(Date(1999, 1, 6).daysInMonth == 31);
assert(Date(1999, 2, 7).daysInMonth == 28);
assert(Date(2000, 2, 7).daysInMonth == 29);
assert(Date(2000, 6, 4).daysInMonth == 30);
const pure nothrow @property @safe bool isAD();
Является ли текущий год датой, находящейся в Нашей Эре.
Примеры:
assert(Date(1, 1, 1).isAD);
assert(Date(2010, 12, 31).isAD);
assert(!Date(0, 12, 31).isAD);
assert(!Date(-2010, 1, 1).isAD);
const pure nothrow @property @safe long julianDay();
Юлианский день для этой даты в полдень (поскольку дата юлианского дня меняется в полдень).
const pure nothrow @property @safe long modJulianDay();
Модифицированный Юлианский день для любого времени этой даты (поскольку дата модифицированного юлианского дня меняется в полночь).
const pure nothrow @safe string toISOString();
Преобразует эту Date в строку с форматом YYYYMMDD.
Примеры:
assert(Date(2010, 7, 4).toISOString() == "20100704");
assert(Date(1998, 12, 25).toISOString() == "19981225");
assert(Date(0, 1, 5).toISOString() == "00000105");
assert(Date(-4, 1, 5).toISOString() == "-00040105");
const pure nothrow @safe string toISOExtString();
Преобразует эту Date в строку с форматом YYYY-MM-DD.
Примеры:
assert(Date(2010, 7, 4).toISOExtString() == "2010-07-04");
assert(Date(1998, 12, 25).toISOExtString() == "1998-12-25");
assert(Date(0, 1, 5).toISOExtString() == "0000-01-05");
assert(Date(-4, 1, 5).toISOExtString() == "-0004-01-05");
const pure nothrow @safe string toSimpleString();
Преобразует эту Date в строку с форматом YYYY-Mon-DD.
Примеры:
assert(Date(2010, 7, 4).toSimpleString() == "2010-Jul-04");
assert(Date(1998, 12, 25).toSimpleString() == "1998-Dec-25");
assert(Date(0, 1, 5).toSimpleString() == "0000-Jan-05");
assert(Date(-4, 1, 5).toSimpleString() == "-0004-Jan-05");
const pure nothrow @safe string toString();
Преобразует эту Date в строку.
pure @safe Date fromISOString(S)(in S isoString)
if (isSomeString!S);
Создает Date из строки с форматом YYYYMMDD. Пробелы удаляются из переданной строки.
Параметры:
S isoString Строка, отформатированная в формате ISO для даты.
Исключения:
DateTimeException, если данная строка не находится в формате ISO, или если результирующая Date недействительна.
pure @safe Date fromISOExtString(S)(in S isoExtString)
if (isSomeString!S);
Создает Date из строки с форматом YYYY-MM-DD. Пробелы удаляются из переданной строки.
Параметры:
S isoExtString Строка, отформатированная в расширенном формате ISO для даты.
Исключения:
DateTimeException, если данная строка не находится в расширенном формате ISO, или если результирующая Date недействительна.
pure @safe Date fromSimpleString(S)(in S simpleString)
if (isSomeString!S);
Создает Date из строки с форматом YYYY-Mon-DD. Пробелы удаляются из переданной строки.
Параметры:
S simpleString Строка, отформатированная так, как toSimpleString форматирует даты
Исключения:
DateTimeException, если данная строка не находится в корректном формате, или если результирующая Date недействительна.
static pure nothrow @property @safe Date min();
Возвращает самое раннее из всех возможных значений Date.
static pure nothrow @property @safe Date max();
Возвращает самое позднее из всех возможных значений Date.

Переместиться к: fromISOExtString · fromISOString · hour · max · min · minute · opBinary · opCmp · opOpAssign · roll · second · this · toISOExtString · toISOString · toString

struct TimeOfDay;
Представляет время суток с часами, минутами и секундами. Использует 24-часовое время.
pure @safe this(int hour, int minute, int second = 0);
Параметры:
int hour Значение часа дня [0 - 24).
int minute Значение минуты в часе [0 - 60).
int second Значение секунды в минуте [0 - 60).
Исключения:
DateTimeException, если результирующий экземпляр TimeOfDay не будет действительным.
const pure nothrow @safe int opCmp(in TimeOfDay rhs);
Сравнивает это TimeOfDay с переданным TimeOfDay.
Возвращает:
this < rhs < 0
this == rhs 0
this > rhs > 0

Переместиться к: 2

const pure nothrow @property @safe ubyte hour();
Количество часов от полуночи.
pure @property @safe void hour(int hour);
Присвоить количество часов от полуночи.
Параметры:
int hour Номер часа в сутках, устанавливаемый компоненту hour этого TimeOfDay.
Исключения:
DateTimeException, если полученное значение hour приводит к недействительному TimeOfDay.

Переместиться к: 2

const pure nothrow @property @safe ubyte minute();
Номер минуты в часе.
pure @property @safe void minute(int minute);
Присвоить номер минуты в часе.
Параметры:
int minute Номер минуты в часе, устанавливаемый компоненту minute этого TimeOfDay.
Исключения:
DateTimeException, если полученное значение minute приводит к недействительному TimeOfDay.

Переместиться к: 2

const pure nothrow @property @safe ubyte second();
Номер секунды в минуте.
pure @property @safe void second(int second);
Присвоить номер секунды в минуте.
Параметры:
int second Номер секунды в минуте, устанавливаемый компоненту second этого TimeOfDay.
Исключения:
DateTimeException, если полученное значение second приводит к недействительному TimeOfDay.
pure nothrow ref @safe TimeOfDay roll(string units)(long value)
if (units == "hours");
Добавляет заданное количество единиц к этому TimeOfDay. Отрицательное число будет вычитаться.
Разница между функцией roll и сложением заключается в том, что roll не влияет на более крупные единицы. Например, при применении roll к TimeOfDay на количество минут, составляющих один час, получится то же самое TimeOfDay.
Принимаются следующие единицы: "hours", "minutes", и "seconds".
Параметры:
units Добавляемые единицы.
long value Количество единиц для добавления к этому TimeOfDay.
Примеры:
auto tod1 = TimeOfDay(7, 12, 0);
tod1.roll!"hours"(1);
assert(tod1 == TimeOfDay(8, 12, 0));

auto tod2 = TimeOfDay(7, 12, 0);
tod2.roll!"hours"(-1);
assert(tod2 == TimeOfDay(6, 12, 0));

auto tod3 = TimeOfDay(23, 59, 0);
tod3.roll!"minutes"(1);
assert(tod3 == TimeOfDay(23, 0, 0));

auto tod4 = TimeOfDay(0, 0, 0);
tod4.roll!"minutes"(-1);
assert(tod4 == TimeOfDay(0, 59, 0));

auto tod5 = TimeOfDay(23, 59, 59);
tod5.roll!"seconds"(1);
assert(tod5 == TimeOfDay(23, 59, 0));

auto tod6 = TimeOfDay(0, 0, 0);
tod6.roll!"seconds"(-1);
assert(tod6 == TimeOfDay(0, 0, 59));

Переместиться к: 2 · 3

const pure nothrow @safe TimeOfDay opBinary(string op)(Duration duration)
if (op == "+" || op == "-");
Дает результат добавления или вычитания core.time.Duration из этого TimeOfDay.
Допустимые типы арифметики для TimeOfDay с использованием этого оператора:
TimeOfDay + Duration --> TimeOfDay
TimeOfDay - Duration --> TimeOfDay
Параметры:
Duration duration Экземпляр core.time.Duration для добавления или вычитания из этого TimeOfDay.
Примеры:
assert(TimeOfDay(12, 12, 12) + seconds(1) == TimeOfDay(12, 12, 13));
assert(TimeOfDay(12, 12, 12) + minutes(1) == TimeOfDay(12, 13, 12));
assert(TimeOfDay(12, 12, 12) + hours(1) == TimeOfDay(13, 12, 12));
assert(TimeOfDay(23, 59, 59) + seconds(1) == TimeOfDay(0, 0, 0));

assert(TimeOfDay(12, 12, 12) - seconds(1) == TimeOfDay(12, 12, 11));
assert(TimeOfDay(12, 12, 12) - minutes(1) == TimeOfDay(12, 11, 12));
assert(TimeOfDay(12, 12, 12) - hours(1) == TimeOfDay(11, 12, 12));
assert(TimeOfDay(0, 0, 0) - seconds(1) == TimeOfDay(23, 59, 59));
const pure nothrow @safe TimeOfDay opBinary(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы + и - с типом core.time.TickDuration.

Переместиться к: 2

pure nothrow ref @safe TimeOfDay opOpAssign(string op)(Duration duration)
if (op == "+" || op == "-");
Получить результат прибавления или вычитания core.time.Duration из этого TimeOfDay, и присвоить результат этому TimeOfDay.
Допустимые типы арифметики для TimeOfDay с использованием этого оператора:
TimeOfDay + Duration --> TimeOfDay
TimeOfDay - Duration --> TimeOfDay
Параметры:
Duration duration Экземпляр core.time.Duration для добавления или вычитания из этого TimeOfDay.
pure nothrow ref @safe TimeOfDay opOpAssign(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы += и -= с типом core.time.TickDuration.
const pure nothrow @safe Duration opBinary(string op)(in TimeOfDay rhs)
if (op == "-");
Даёт разницу между двумя экземплярами TimeOfDay.
Допустимые типы арифметики для TimeOfDay с использованием этого оператора:
TimeOfDay - TimeOfDay --> duration
Параметры:
TimeOfDay rhs Экземпляр TimeOfDay для вычитания из этого TimeOfDay.
const pure nothrow @safe string toISOString();
Преобразует это TimeOfDay в строку с форматом HHMMSS.
Примеры:
assert(TimeOfDay(0, 0, 0).toISOString() == "000000");
assert(TimeOfDay(12, 30, 33).toISOString() == "123033");
const pure nothrow @safe string toISOExtString();
Преобразует это TimeOfDay в строку с форматом HH:MM:SS.
Примеры:
assert(TimeOfDay(0, 0, 0).toISOExtString() == "00:00:00");
assert(TimeOfDay(12, 30, 33).toISOExtString() == "12:30:33");
const pure nothrow @safe string toString();
Преобразует это TimeOfDay в строку
pure @safe TimeOfDay fromISOString(S)(in S isoString)
if (isSomeString!S);
Создаёт TimeOfDay из строки с форматом HHMMSS. Пробелы удаляются из заданной строки.
Параметры:
S isoString Строка, отформатированная в формате ISO для времени.
Исключения:
DateTimeException, если данная строка не находится в формате ISO, или если результирующее TimeOfDay недействительно.
pure @safe TimeOfDay fromISOExtString(S)(in S isoExtString)
if (isSomeString!S);
Создаёт TimeOfDay из строки с форматом HH:MM:SS. Пробелы удаляются из заданной строки.
Параметры:
S isoExtString Строка, отформатированная в расширенном формате ISO для времени.
Исключения:
DateTimeException, если данная строка не находится в расширенном формате ISO, или если результирующее TimeOfDay недействительно.
static pure nothrow @property @safe TimeOfDay min();
Возвращает полночь.
static pure nothrow @property @safe TimeOfDay max();
Возвращает время за одну секунду до полуночи.
struct DateTime;
Объединяет структуры Date и TimeOfDay, чтобы дать объект, который содержит как дату, так и время. Он оптимизирован для календарных операций и не имеет понятия о часовом поясе. В качестве объекта, который оптимизирован для временных операций на основе системного времени, используйте SysTime. SysTime содержит концепцию часового пояса и имеет гораздо более высокую точность (hnsecs). DateTime главным образом предназначен для использования календарных операций, а не для работы с точным временем.

Переместиться к: 2

pure nothrow @safe this(in Date date, in TimeOfDay tod = TimeOfDay.init);
Параметры:
Date date Часть DateTime, связанная с датой.
TimeOfDay tod Часть DateTime, связанная с временем.
pure @safe this(int year, int month, int day, int hour = 0, int minute = 0, int second = 0);
Параметры:
int year Год в составе даты.
int month Месяц в составе даты.
int day День в составе даты.
int hour Час в составе времени;
int minute Минута в составе времени;
int second Секунда в составе времени;
const pure nothrow @safe int opCmp(in DateTime rhs);
Сравнивает эту DateTime с переданной DateTime.
Возвращает:
this < rhs < 0
this == rhs 0
this > rhs > 0

Переместиться к: 2

const pure nothrow @property @safe Date date();
Часть DateTime, связанная с датой.
pure nothrow @property @safe void date(in Date date);
Присвоить часть DateTime, связанную с датой.
Параметры:
Date date Дата, присваиваемая дате в этой DateTime.

Переместиться к: 2

const pure nothrow @property @safe TimeOfDay timeOfDay();
Часть DateTime, связанная с временем.
pure nothrow @property @safe void timeOfDay(in TimeOfDay tod);
Присвоить часть DateTime, связанную с временем.
Параметры:
TimeOfDay tod Время суток, присваиваемое времени в этой DateTime.

Переместиться к: 2

const pure nothrow @property @safe short year();
Год григорианского календаря. Положительными являются годы Нашей Эры, неположительными – годы до Нашей Эры.
pure @property @safe void year(int year);
Присвоить год григорианского календаря. Положительными являются годы Нашей Эры, неположительными – годы до Нашей Эры.
Параметры:
int year Год для установки года этой DateTime.
Исключения:
DateTimeException, если полученный год не является високосным годом, а результирующая дата будет 29 февраля.
Примеры:
assert(DateTime(Date(1999, 7, 6), TimeOfDay(9, 7, 5)).year == 1999);
assert(DateTime(Date(2010, 10, 4), TimeOfDay(0, 0, 30)).year == 2010);
assert(DateTime(Date(-7, 4, 5), TimeOfDay(7, 45, 2)).year == -7);

Переместиться к: 2

const pure @property @safe short yearBC();
Год григорианского календаря до Нашей Эры, с расчётом, что год 0 является первым годом до н.э.
Исключения:
DateTimeException, если isAD равно true.
Примеры:
assert(DateTime(Date(0, 1, 1), TimeOfDay(12, 30, 33)).yearBC == 1);
assert(DateTime(Date(-1, 1, 1), TimeOfDay(10, 7, 2)).yearBC == 2);
assert(DateTime(Date(-100, 1, 1), TimeOfDay(4, 59, 0)).yearBC == 101);
pure @property @safe void yearBC(int year);
Присвоить год григорианского календаря до Нашей Эры, с расчётом, что год 0 является первым годом до н.э.
Параметры:
int year Год до н.э., присваиваемый этой DateTime.
Исключения:
DateTimeException, если передано неположительное значение.
Примеры:
auto dt = DateTime(Date(2010, 1, 1), TimeOfDay(7, 30, 0));
dt.yearBC = 1;
assert(dt == DateTime(Date(0, 1, 1), TimeOfDay(7, 30, 0)));

dt.yearBC = 10;
assert(dt == DateTime(Date(-9, 1, 1), TimeOfDay(7, 30, 0)));

Переместиться к: 2

const pure nothrow @property @safe Month month();
Месяц григорианского календаря.
Примеры:
assert(DateTime(Date(1999, 7, 6), TimeOfDay(9, 7, 5)).month == 7);
assert(DateTime(Date(2010, 10, 4), TimeOfDay(0, 0, 30)).month == 10);
assert(DateTime(Date(-7, 4, 5), TimeOfDay(7, 45, 2)).month == 4);
pure @property @safe void month(Month month);
Присвоить месяц григорианского календаря.
Параметры:
Month month Значение месяца для присвоения этой DateTime.
Исключения:
DateTimeException, если переданное значение месяца не является допустимым.

Переместиться к: 2

const pure nothrow @property @safe ubyte day();
День месяца григорианского календаря.
Примеры:
assert(DateTime(Date(1999, 7, 6), TimeOfDay(9, 7, 5)).day == 6);
assert(DateTime(Date(2010, 10, 4), TimeOfDay(0, 0, 30)).day == 4);
assert(DateTime(Date(-7, 4, 5), TimeOfDay(7, 45, 2)).day == 5);
pure @property @safe void day(int day);
Присвоить день месяца григорианского календаря.
Параметры:
int day День месяца для установки значения дня этой DateTime.
Исключения:
DateTimeException, если данный день не является действительным днём текущего месяца.

Переместиться к: 2

const pure nothrow @property @safe ubyte hour();
Количество часов от полуночи.
pure @property @safe void hour(int hour);
Присвоить количество часов от полуночи.
Параметры:
int hour Номер часа в сутках, устанавливаемый компоненту hour этой DateTime.
Исключения:
DateTimeException, если полученное значение hour приводит к недействительному значению DateTime.

Переместиться к: 2

const pure nothrow @property @safe ubyte minute();
Номер минуты в часе.
pure @property @safe void minute(int minute);
Присвоить номер минуты в часе.
Параметры:
int minute Номер минуты в часе, устанавливаемый компоненту minute этой DateTime.
Исключения:
DateTimeException, если полученное значение minute приводит к недействительному значению DateTime.

Переместиться к: 2

const pure nothrow @property @safe ubyte second();
Номер секунды в минуте.
pure @property @safe void second(int second);
Присвоить номер секунды в минуте.
Параметры:
int second Номер секунды в минуте, устанавливаемый компоненту second этой DateTime.
Исключения:
DateTimeException, если полученное значение second приводит к недействительному значению DateTime.
pure nothrow ref @safe DateTime add(string units)(long value, AllowDayOverflow allowOverflow = Yes.allowDayOverflow)
if (units == "years" || units == "months");
Добавляет заданное количество лет или месяцев к этой DateTime. Отрицательное число будет вычитаться.
Обратите внимание, что если разрешено day overflow (переполнение дня), а дата с изменённым годом/месяцем переполняет количество дней в новом месяце, то месяц увеличится на единицу, а день будет установлен на количество переполнения (например, если день был 31, а новый месяц – июнь, то месяц будет увеличен до июля, а новый день будет 1). Если day overflow не разрешено, то день будет установлен на последний действительный день того же месяца (например, 31 июня станет 30 июня).
Параметры:
units Тип единиц для добавления ("years" или "months").
long value Количество месяцев или лет для добавления к этой DateTime.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня, что может привести к увеличению месяца.
Примеры:
auto dt1 = DateTime(2010, 1, 1, 12, 30, 33);
dt1.add!"months"(11);
assert(dt1 == DateTime(2010, 12, 1, 12, 30, 33));

auto dt2 = DateTime(2010, 1, 1, 12, 30, 33);
dt2.add!"months"(-11);
assert(dt2 == DateTime(2009, 2, 1, 12, 30, 33));

auto dt3 = DateTime(2000, 2, 29, 12, 30, 33);
dt3.add!"years"(1);
assert(dt3 == DateTime(2001, 3, 1, 12, 30, 33));

auto dt4 = DateTime(2000, 2, 29, 12, 30, 33);
dt4.add!"years"(1, No.allowDayOverflow);
assert(dt4 == DateTime(2001, 2, 28, 12, 30, 33));

Переместиться к: 2

pure nothrow ref @safe DateTime roll(string units)(long value, AllowDayOverflow allowOverflow = Yes.allowDayOverflow)
if (units == "years" || units == "months");
Добавляет заданное количество лет или месяцев к этой DateTime. Отрицательное число будет вычитаться.
Разница между roll и add заключается в том, что roll не влияет на более крупные единицы. roll с добавлением 12 месяцев, применённый к DateTime, даст в результате ту же самую DateTime. Тем не менее, дни могут измениться из-за различного количества дней в каждом месяце.
Поскольку нет единиц больших, чем годы, то нет никакой разницы между add и roll с параметром "years".
Параметры:
units Тип единиц для добавления ("years" или "months").
long value Количество месяцев или лет для добавления к этой DateTime.
AllowDayOverflow allowOverflow Допустимо ли переполнение дней, что заставит увеличиться месяц.
Примеры:
auto dt1 = DateTime(2010, 1, 1, 12, 33, 33);
dt1.roll!"months"(1);
assert(dt1 == DateTime(2010, 2, 1, 12, 33, 33));

auto dt2 = DateTime(2010, 1, 1, 12, 33, 33);
dt2.roll!"months"(-1);
assert(dt2 == DateTime(2010, 12, 1, 12, 33, 33));

auto dt3 = DateTime(1999, 1, 29, 12, 33, 33);
dt3.roll!"months"(1);
assert(dt3 == DateTime(1999, 3, 1, 12, 33, 33));

auto dt4 = DateTime(1999, 1, 29, 12, 33, 33);
dt4.roll!"months"(1, No.allowDayOverflow);
assert(dt4 == DateTime(1999, 2, 28, 12, 33, 33));

auto dt5 = DateTime(2000, 2, 29, 12, 30, 33);
dt5.roll!"years"(1);
assert(dt5 == DateTime(2001, 3, 1, 12, 30, 33));

auto dt6 = DateTime(2000, 2, 29, 12, 30, 33);
dt6.roll!"years"(1, No.allowDayOverflow);
assert(dt6 == DateTime(2001, 2, 28, 12, 30, 33));
pure nothrow ref @safe DateTime roll(string units)(long value)
if (units == "days");
Добавляет заданное количество единиц к этой DateTime. Отрицательное число будет вычитаться.
Разница между roll и сложением заключается в том, что roll не влияет на более крупные единицы. Например, при применении roll к DateTime на количество дней, составляющих один год, получится та же самая DateTime.
допустимыми единицами являются "days", "hours", "minutes" и "seconds".
Параметры:
units Добавляемые единицы.
long value Количество единиц, добавляемых к этой DateTime.
Примеры:
auto dt1 = DateTime(2010, 1, 1, 11, 23, 12);
dt1.roll!"days"(1);
assert(dt1 == DateTime(2010, 1, 2, 11, 23, 12));
dt1.roll!"days"(365);
assert(dt1 == DateTime(2010, 1, 26, 11, 23, 12));
dt1.roll!"days"(-32);
assert(dt1 == DateTime(2010, 1, 25, 11, 23, 12));

auto dt2 = DateTime(2010, 7, 4, 12, 0, 0);
dt2.roll!"hours"(1);
assert(dt2 == DateTime(2010, 7, 4, 13, 0, 0));

auto dt3 = DateTime(2010, 1, 1, 0, 0, 0);
dt3.roll!"seconds"(-1);
assert(dt3 == DateTime(2010, 1, 1, 0, 0, 59));

Переместиться к: 2 · 3

const pure nothrow @safe DateTime opBinary(string op)(Duration duration)
if (op == "+" || op == "-");
Даёт результат добавления или вычитания core.time.Duration из этой DateTime.
Допустимые типы арифметики для DateTime с использованием этого оператора:
DateTime + Duration --> DateTime
DateTime - Duration --> DateTime
Параметры:
Duration duration Экземпляр core.time.Duration для добавления или вычитания из этой DateTime.
Примеры:
assert(DateTime(2015, 12, 31, 23, 59, 59) + seconds(1) ==
       DateTime(2016, 1, 1, 0, 0, 0));

assert(DateTime(2015, 12, 31, 23, 59, 59) + hours(1) ==
       DateTime(2016, 1, 1, 0, 59, 59));

assert(DateTime(2016, 1, 1, 0, 0, 0) - seconds(1) ==
       DateTime(2015, 12, 31, 23, 59, 59));

assert(DateTime(2016, 1, 1, 0, 59, 59) - hours(1) ==
       DateTime(2015, 12, 31, 23, 59, 59));
const pure nothrow @safe DateTime opBinary(string op)(in TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы + и - с типом core.time.TickDuration.

Переместиться к: 2

pure nothrow ref @safe DateTime opOpAssign(string op, D)(in D duration)
if ((op == "+" || op == "-") && (is(Unqual!D == Duration) || is(Unqual!D == TickDuration)));
Получить результат прибавления или вычитания core.time.Duration из этой DateTime, и присвоить результат этой DateTime.
Допустимые типы арифметики для DateTime с использованием этого оператора:
DateTime + duration --> DateTime
DateTime - duration --> DateTime
Параметры:
D duration Экземпляр core.time.Duration для добавления или вычитания из этой DateTime.
pure nothrow ref @safe DateTime opOpAssign(string op)(TickDuration td)
if (op == "+" || op == "-");
Устаревшее. core.time.TickDuration будет устаревать в пользу core.time.MonoTime и core.time.Duration. Вместо этого используйте Duration. Эта перегрузка будет удалена в январе 2017 года.
Определяет операторы += и -= с типом core.time.TickDuration.
const pure nothrow @safe Duration opBinary(string op)(in DateTime rhs)
if (op == "-");
Дает разницу между двумя экземплярами DateTime.
Допустимые типы арифметики для DateTime с использованием этого оператора:
DateTime - DateTime --> duration
const pure nothrow @safe int diffMonths(in DateTime rhs);
Возвращает разницу между двумя экземплярами DateTime в месяцах.
Чтобы получить разницу в годах, вычтите свойства year двух экземпляров DateTime. Чтобы получить разницу в днях или неделях, вычтите сами экземпляры DateTime и используйте результат в виде core.time.Duration. Поскольку для конвертации между месяцами и меньшими единицами требуется определённая дата (которой нет у core.time.Duration), получение разницы в месяцах требует некоторой математики, использующей свойства как со значением года, так и месяца, так что это удобная функция для получения разницы в месяцах.
Обратите внимание, что количество дней в месяцах или то, как далеко даты находятся от начала месяца, не имеет значения. Это разница в свойствах month в комбинации с разницей свойств years, умноженной на 12. Так, например, между 31 декабря и 1 января будет разница в один месяц, так же, как между 1 декабря и 31 января – тоже один месяц.
Параметры:
DateTime rhs Экземпляр DateTime, вычитаемый из этой DateTime.
Примеры:
assert(DateTime(1999, 2, 1, 12, 2, 3).diffMonths(
            DateTime(1999, 1, 31, 23, 59, 59)) == 1);

assert(DateTime(1999, 1, 31, 0, 0, 0).diffMonths(
            DateTime(1999, 2, 1, 12, 3, 42)) == -1);

assert(DateTime(1999, 3, 1, 5, 30, 0).diffMonths(
            DateTime(1999, 1, 1, 2, 4, 7)) == 2);

assert(DateTime(1999, 1, 1, 7, 2, 4).diffMonths(
            DateTime(1999, 3, 31, 0, 30, 58)) == -2);
const pure nothrow @property @safe bool isLeapYear();
Является ли год этой DateTime високосным годом.
const pure nothrow @property @safe DayOfWeek dayOfWeek();
День недели этой DateTime.

Переместиться к: 2

const pure nothrow @property @safe ushort dayOfYear();
День года этой DateTime.
Примеры:
assert(DateTime(Date(1999, 1, 1), TimeOfDay(12, 22, 7)).dayOfYear == 1);
assert(DateTime(Date(1999, 12, 31), TimeOfDay(7, 2, 59)).dayOfYear == 365);
assert(DateTime(Date(2000, 12, 31), TimeOfDay(21, 20, 0)).dayOfYear == 366);
pure @property @safe void dayOfYear(int day);
Присвоить день года.
Параметры:
int day День года, устанавливаемый этой DateTime.

Переместиться к: 2

const pure nothrow @property @safe int dayOfGregorianCal();
Номер дня по григорианскому календарю этой DateTime.
Примеры:
assert(DateTime(Date(1, 1, 1), TimeOfDay(0, 0, 0)).dayOfGregorianCal == 1);
assert(DateTime(Date(1, 12, 31), TimeOfDay(23, 59, 59)).dayOfGregorianCal == 365);
assert(DateTime(Date(2, 1, 1), TimeOfDay(2, 2, 2)).dayOfGregorianCal == 366);

assert(DateTime(Date(0, 12, 31), TimeOfDay(7, 7, 7)).dayOfGregorianCal == 0);
assert(DateTime(Date(0, 1, 1), TimeOfDay(19, 30, 0)).dayOfGregorianCal == -365);
assert(DateTime(Date(-1, 12, 31), TimeOfDay(4, 7, 0)).dayOfGregorianCal == -366);

assert(DateTime(Date(2000, 1, 1), TimeOfDay(9, 30, 20)).dayOfGregorianCal == 730_120);
assert(DateTime(Date(2010, 12, 31), TimeOfDay(15, 45, 50)).dayOfGregorianCal == 734_137);
pure nothrow @property @safe void dayOfGregorianCal(int days);
Присвоить номер дня по григорианскому календарю этой DateTime. Установка этого свойства не влияет на часть DateTime, связанную с временем.
Параметры:
int days Номер дня по григорианскому календарю для присвоения этой DateTime.
Примеры:
auto dt = DateTime(Date.init, TimeOfDay(12, 0, 0));
dt.dayOfGregorianCal = 1;
assert(dt == DateTime(Date(1, 1, 1), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = 365;
assert(dt == DateTime(Date(1, 12, 31), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = 366;
assert(dt == DateTime(Date(2, 1, 1), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = 0;
assert(dt == DateTime(Date(0, 12, 31), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = -365;
assert(dt == DateTime(Date(-0, 1, 1), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = -366;
assert(dt == DateTime(Date(-1, 12, 31), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = 730_120;
assert(dt == DateTime(Date(2000, 1, 1), TimeOfDay(12, 0, 0)));

dt.dayOfGregorianCal = 734_137;
assert(dt == DateTime(Date(2010, 12, 31), TimeOfDay(12, 0, 0)));
const pure nothrow @property @safe ubyte isoWeek();
Номер недели этой DateTime в соответствии со стандартом ISO 8601.
Смотрите также:
const pure nothrow @property @safe DateTime endOfMonth();
DateTime в последний день месяца, в котором находится эта DateTime. Временная часть endOfMonth всегда равна 23:59:59.
Примеры:
assert(DateTime(Date(1999, 1, 6), TimeOfDay(0, 0, 0)).endOfMonth ==
       DateTime(Date(1999, 1, 31), TimeOfDay(23, 59, 59)));

assert(DateTime(Date(1999, 2, 7), TimeOfDay(19, 30, 0)).endOfMonth ==
       DateTime(Date(1999, 2, 28), TimeOfDay(23, 59, 59)));

assert(DateTime(Date(2000, 2, 7), TimeOfDay(5, 12, 27)).endOfMonth ==
       DateTime(Date(2000, 2, 29), TimeOfDay(23, 59, 59)));

assert(DateTime(Date(2000, 6, 4), TimeOfDay(12, 22, 9)).endOfMonth ==
       DateTime(Date(2000, 6, 30), TimeOfDay(23, 59, 59)));
const pure nothrow @property @safe ubyte daysInMonth();
Последний день месяца, в котором находится эта DateTime.
Примеры:
assert(DateTime(Date(1999, 1, 6), TimeOfDay(0, 0, 0)).daysInMonth == 31);
assert(DateTime(Date(1999, 2, 7), TimeOfDay(19, 30, 0)).daysInMonth == 28);
assert(DateTime(Date(2000, 2, 7), TimeOfDay(5, 12, 27)).daysInMonth == 29);
assert(DateTime(Date(2000, 6, 4), TimeOfDay(12, 22, 9)).daysInMonth == 30);
const pure nothrow @property @safe bool isAD();
Является ли текущий год датой, находящейся в Нашей Эре.
Примеры:
assert(DateTime(Date(1, 1, 1), TimeOfDay(12, 7, 0)).isAD);
assert(DateTime(Date(2010, 12, 31), TimeOfDay(0, 0, 0)).isAD);
assert(!DateTime(Date(0, 12, 31), TimeOfDay(23, 59, 59)).isAD);
assert(!DateTime(Date(-2010, 1, 1), TimeOfDay(2, 2, 2)).isAD);
const pure nothrow @property @safe long julianDay();
Юлианский день для этой DateTime в данный момент времени. Например, до полудня 1996-03-31 был бы юлианским днём № 2_450_173, поэтому эта функция возвращает 2_450_173, а после полудня число юлианских дней будет 2_450_174, поэтому эта функция возвращает 2_450_174.
const pure nothrow @property @safe long modJulianDay();
Модифицированный Юлианский день для любого времени этой даты (поскольку дата модифицированного юлианского дня меняется в полночь).
const pure nothrow @safe string toISOString();
Преобразует эту DateTime в строку с форматом YYYYMMDDTHHMMSS.
Примеры:
assert(DateTime(Date(2010, 7, 4), TimeOfDay(7, 6, 12)).toISOString() ==
       "20100704T070612");

assert(DateTime(Date(1998, 12, 25), TimeOfDay(2, 15, 0)).toISOString() ==
       "19981225T021500");

assert(DateTime(Date(0, 1, 5), TimeOfDay(23, 9, 59)).toISOString() ==
       "00000105T230959");

assert(DateTime(Date(-4, 1, 5), TimeOfDay(0, 0, 2)).toISOString() ==
       "-00040105T000002");
const pure nothrow @safe string toISOExtString();
Преобразует эту DateTime в строку с форматом YYYY-MM-DDTHH:MM:SS.
Примеры:
assert(DateTime(Date(2010, 7, 4), TimeOfDay(7, 6, 12)).toISOExtString() ==
       "2010-07-04T07:06:12");

assert(DateTime(Date(1998, 12, 25), TimeOfDay(2, 15, 0)).toISOExtString() ==
       "1998-12-25T02:15:00");

assert(DateTime(Date(0, 1, 5), TimeOfDay(23, 9, 59)).toISOExtString() ==
       "0000-01-05T23:09:59");

assert(DateTime(Date(-4, 1, 5), TimeOfDay(0, 0, 2)).toISOExtString() ==
       "-0004-01-05T00:00:02");
const pure nothrow @safe string toSimpleString();
Преобразует эту DateTime в строку с форматом YYYY-Mon-DD HH:MM:SS.
Примеры:
assert(DateTime(Date(2010, 7, 4), TimeOfDay(7, 6, 12)).toSimpleString() ==
       "2010-Jul-04 07:06:12");

assert(DateTime(Date(1998, 12, 25), TimeOfDay(2, 15, 0)).toSimpleString() ==
       "1998-Dec-25 02:15:00");

assert(DateTime(Date(0, 1, 5), TimeOfDay(23, 9, 59)).toSimpleString() ==
       "0000-Jan-05 23:09:59");

assert(DateTime(Date(-4, 1, 5), TimeOfDay(0, 0, 2)).toSimpleString() ==
       "-0004-Jan-05 00:00:02");
const pure nothrow @safe string toString();
Преобразует эту DateTime в строку.
pure @safe DateTime fromISOString(S)(in S isoString)
if (isSomeString!S);
Создает DateTime из строки с форматом YYYYMMDDTHHMMSS. Пробелы удаляются из переданной строки.
Параметры:
S isoString Строка, отформатированная в формате ISO для даты и времени.
Исключения:
DateTimeException, если данная строка не находится в формате ISO, или если результирующая DateTime недействительна.
pure @safe DateTime fromISOExtString(S)(in S isoExtString)
if (isSomeString!S);
Создает DateTime из строки с форматом YYYY-MM-DDTHH:MM:SS. Пробелы удаляются из переданной строки.
Параметры:
S isoExtString Строка, отформатированная в расширенном формате ISO для даты и времени.
Исключения:
DateTimeException, если данная строка не находится в расширенном формате ISO, или если результирующая DateTime недействительна.
pure @safe DateTime fromSimpleString(S)(in S simpleString)
if (isSomeString!S);
Создает DateTime из строки с форматом YYYY-Mon-DD HH:MM:SS. Пробелы удаляются из переданной строки.
Параметры:
S simpleString Строка, отформатированная так, как toSimpleString форматирует даты и время.
Исключения:
DateTimeException, если данная строка не находится в корректном формате, или если результирующая DateTime недействительна.
static pure nothrow @property @safe DateTime min();
Возвращает самое раннее из всех возможных значений DateTime.
static pure nothrow @property @safe DateTime max();
Возвращает самое позднее из всех возможных значений DateTime.

Переместиться к: begin · bwdRange · contains · empty · end · expand · fwdRange · intersection · intersects · isAdjacent · isAfter · isBefore · length · merge · opAssign · shift · span · this · toString

struct Interval(TP);
Представляет интервал времени.
Interval имеет начальную отметку и конечную отметку. Таким образом, интервал времени – это время, начинающееся с начальной отметки, вплоть до конечной отметки, но не включая её. Например:
[January 5th, 2010 - March 10th, 2010)
[05:00:30 - 12:00:00)
[1982-01-04T08:59:00 - 2010-07-04T12:00:00)
Из интервала можно получить диапазон, позволяющий выполнять итерацию по этому интервалу, с точными отметками времени, положение которых зависит от функции, генерирующей диапазон.
Почему-то здесь это не указано, но тип TP (отметка времени) должен удовлетворять условию isTimePoint(TP). Таким образом, допустимыми типами являются: Date, DateTime, SysTime, TimeOfDay, core.time.MonoTime – доп. пер.

Переместиться к: 2

pure this(U)(in TP begin, in U end)
if (is(Unqual!TP == Unqual!U));
Параметры:
TP begin Отметка времени начала интервала.
U end Отметка времени, в которой интервал заканчивается (но не входит в него).
Исключения:
DateTimeException, если end раньше, чем begin.

Пример:

Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1));

pure this(D)(in TP begin, in D duration)
if (__traits(compiles, begin + duration));
Параметры:
TP begin Отметка времени начала интервала.
D duration Длительность от начальной отметки до конечной отметки.
Исключения:
DateTimeException, если в результате end станет раньше, чем begin.

Пример:

assert(Interval!Date(Date(1996, 1, 2), dur!"days"(3)) ==
       Interval!Date(Date(1996, 1, 2), Date(1996, 1, 5)));

Переместиться к: 2

pure nothrow ref Interval opAssign(ref const Interval rhs);
Параметры:
Interval rhs Interval для присвоения этому экземпляру.
pure nothrow ref Interval opAssign(Interval rhs);
Параметры:
Interval rhs Interval для присвоения этому экземпляру.

Переместиться к: 2

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 Отметка времени, устанавливаемая в качестве начальной.
Исключения:
DateTimeException, если результирующий интервал будет недействительным.

Переместиться к: 2

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 Отметка времени, устанавливаемая в качестве конечной.
Исключения:
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, то есть, begin == end.

Пример:

assert(Interval!Date(Date(1996, 1, 2), Date(1996, 1, 2)).empty);
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).empty);

Переместиться к: 2 · 3 · 4

const pure bool contains(in TP timePoint);
Находится ли заданная отметка времени в этом интервале.
Параметры:
TP timePoint Отметка времени, для которой проверяется включение в этот интервал.
Исключения:
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(in Interval interval);
Находится ли заданный интервал полностью внутри этого интервала.
Параметры:
Interval interval Интервал, для которого проверяется включение в этот интервал.
Исключения:
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(in PosInfInterval!TP interval);
Находится ли заданный интервал полностью внутри этого интервала.
Всегда возвращает false (если этот интервал не пуст), потому что интервал, идущий в положительную бесконечность, никогда не может содержаться в конечном интервале.
Параметры:
PosInfInterval!TP interval Интервал, для которого проверяется включение в этот интервал.
Исключения:
DateTimeException, если этот интервал пуст.

Пример:

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            PosInfInterval!Date(Date(1999, 5, 4))));

const pure bool contains(in NegInfInterval!TP interval);
Находится ли заданный интервал полностью внутри этого интервала.
Всегда возвращает false (если этот интервал не пуст), потому что интервал, начинающийся с отрицательной бесконечности, никогда не может содержаться в конечном интервале.
Параметры:
NegInfInterval!TP interval Интервал, для которого проверяется включение в этот интервал.
Исключения:
DateTimeException, если этот интервал пуст.

Пример:

assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).contains(
            NegInfInterval!Date(Date(1996, 5, 4))));

Переместиться к: 2 · 3 · 4

const pure bool isBefore(in TP timePoint);
Находится ли этот интервал до заданной отметки времени.
Параметры:
TP timePoint Отметка времени, для которой проверяется, находится ли этот интервал перед ней.
Исключения:
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(in Interval interval);
Находится ли этот интервал до заданного интервала, при этом не пересекаясь с ним.
Параметры:
Interval interval Интервал для сравнения с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Находится ли этот интервал до заданного интервала, при этом не пересекаясь с ним.
Параметры:
PosInfInterval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
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(in NegInfInterval!TP interval);
Находится ли этот интервал до заданного интервала, при этом не пересекаясь с ним.
Всегда возвращает false (если этот интервал не пуст), потому что конечный интервал никогда не может находиться до интервала, начинающегося с отрицательной бесконечности.
Параметры:
NegInfInterval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
DateTimeException, если этот интервал пуст.

Пример:

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

Переместиться к: 2 · 3 · 4

const pure bool isAfter(in TP timePoint);
Находится ли этот интервал после заданной отметки времени.
Параметры:
TP timePoint Отметка времени, для которой проверяется, находится ли этот интервал после неё.
Исключения:
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(in Interval interval);
Находится ли этот интервал после заданного интервала, при этом не пересекаясь с ним.
Параметры:
Interval interval Интервал для сравнения с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Находится ли этот интервал после заданного интервала, при этом не пересекаясь с ним.
Всегда возвращает false (если этот интервал не пуст), потому что конечный интервал никогда не может находиться после интервала, заканчивающегося положительной бесконечностью.
Параметры:
PosInfInterval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
DateTimeException, если этот интервал пуст.

Пример:

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

const pure bool isAfter(in NegInfInterval!TP interval);
Находится ли этот интервал после заданного интервала, при этом не пересекаясь с ним.
Параметры:
NegInfInterval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
DateTimeException, если этот интервал пуст.

Пример:

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

Переместиться к: 2 · 3

const pure bool intersects(in Interval interval);
Пересекаются ли заданный интервал с этим интервалом.
Параметры:
Interval interval Интервал, для которого проверяется наличие пересечения с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Пересекаются ли заданный интервал с этим интервалом.
Параметры:
PosInfInterval!TP interval Интервал, для которого проверяется наличие пересечения с этим интервалом.
Исключения:
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(in NegInfInterval!TP interval);
Пересекаются ли заданный интервал с этим интервалом.
Параметры:
NegInfInterval!TP interval Интервал, для которого проверяется наличие пересечения с этим интервалом.
Исключения:
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))));

Переместиться к: 2 · 3

const Interval intersection(in Interval interval);
Возвращает пересечение двух интервалов.
Параметры:
Interval interval Интервал, пересекающийся с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Возвращает пересечение двух интервалов.
Параметры:
PosInfInterval!TP interval Интервал, пересекающийся с этим интервалом.
Исключения:
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(in NegInfInterval!TP interval);
Возвращает пересечение двух интервалов.
Параметры:
NegInfInterval!TP interval Интервал, пересекающийся с этим интервалом.
Исключения:
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)));

Переместиться к: 2 · 3

const pure bool isAdjacent(in Interval interval);
Примыкает ли заданный интервал к этому интервалу.

Как я понял, имеется ввиду случай, когда начальная отметка времени одного из интервалов равна конечной отметке времени другого интервала – прим. пер.
Параметры:
Interval interval Интервал, который надо проверить, примыкает ли он к этому интервалу.
Исключения:
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(in PosInfInterval!TP interval);
Примыкает ли заданный интервал к этому интервалу.
Параметры:
PosInfInterval!TP interval Интервал, который надо проверить, примыкает ли он к этому интервалу.
Исключения:
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(in NegInfInterval!TP interval);
Примыкает ли заданный интервал к этому интервалу.
Параметры:
NegInfInterval!TP interval Интервал, который надо проверить, примыкает ли он к этому интервалу.
Исключения:
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))));

Переместиться к: 2 · 3

const Interval merge(in Interval interval);
Возвращает объединение двух интервалов.
Параметры:
Interval interval Интервал для слияния с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Возвращает объединение двух интервалов.
Параметры:
PosInfInterval!TP interval Интервал для слияния с этим интервалом.
Исключения:
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(in NegInfInterval!TP interval);
Возвращает объединение двух интервалов.
Параметры:
NegInfInterval!TP interval Интервал для слияния с этим интервалом.
Исключения:
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)));

Переместиться к: 2 · 3

const pure Interval span(in Interval interval);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов и заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры:
Interval interval Интервал, создающий span вместе с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов и заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры:
PosInfInterval!TP interval Интервал, создающий span вместе с этим интервалом.
Исключения:
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(in NegInfInterval!TP interval);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов и заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры:
NegInfInterval!TP interval Интервал, создающий span вместе с этим интервалом.
Исключения:
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)));

Переместиться к: 2

pure void shift(D)(D duration)
if (__traits(compiles, begin + duration));
Сдвигает интервал вперёд или назад во времени на заданную длительность duration (положительная длительность сдвигает интервал вперёд, отрицательная длительность сдвигает его назад). Фактически, получается begin += duration и end += duration.
Параметры:
D duration Длительность, на которую сдвигается интервал.
Исключения:
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 = Yes.allowDayOverflow)
if (isIntegral!T);
Сдвигает интервал вперёд или назад во времени на заданное количество лет и/или месяцев (положительное количество лет и месяцев сдвигает интервал вперёд, отрицательное число сдвигает его назад). Он добавляет годы и месяцы к началу и концу. Фактически, вызывается add!"years"(), и затем add!"months"() для начала и конца интервала с заданным количеством лет и месяцев.
Параметры:
T years Количество лет, на которое сдвигается интервал.
T months Количество месяцев, на которое сдвигается интервал.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня для begin и end, что может привести к увеличению месяца.
Исключения:
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)));

Переместиться к: 2

pure void expand(D)(D duration, Direction dir = Direction.both)
if (__traits(compiles, begin + duration));
Расширяет интервал вперёд и/или назад во времени. Фактически, получается begin -= duration и/или end += duration. Расширяется ли он вперёд и/или назад во времени, определяется параметром dir.
Параметры:
D duration Длительность, на которую расширяется интервал.
Direction dir Направление во времени для расширения интервала.
Исключения:
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 = Yes.allowDayOverflow, Direction dir = Direction.both)
if (isIntegral!T);
Расширяет интервал вперёд и/или назад во времени. Фактически, вычитается заданное количество месяцев/лет из начала и добавляется к концу. Расширяется ли оно вперёд и/или назад во времени, определяется параметром dir.
Параметры:
T years Количество лет, на которое расширяется интервал.
T months Количество месяцев, на которое расширяется интервал.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня для begin и end, что может привести к увеличению месяца.
Direction dir Направление во времени для расширения интервала.
Исключения:
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(in TP) func, PopFirst popFirst = No.popFirst);
Возвращает диапазон, который выполняет итерации над интервалом вперёд, начиная от begin, используя функцию func для генерации каждой следующей отметки времени.
Первое значение front у диапазона равно началу интервала. func используется для генерации следующего значения front при вызове popFront. Если параметр popFirst равен Yes.popFirst, то popFront вызывается до возврата диапазона (чтобы значение front стало отметкой времени, сгенерированной функцией func).
Если func когда-либо сгенерирует отметку времени, равную текущему значению front диапазона или более раннюю, тогда будет выброшено исключение DateTimeException. Диапазон станет пустым, и итерации завершатся, когда func сгенерирует отметку времени, равную концу интервала или более позднюю.
В этом модуле есть вспомогательные функции, генерирующие частоиспользуемые делегаты для передачи в функцию fwdRange. Их документация начинается с фразы «Генерирующая функция диапазона», что делает их легко доступными для поиска.
Параметры:
TP delegate(in TP) func Функция, используемая для генерации отметок времени диапазона по интервалу.
PopFirst popFirst Следует ли сразу вызвать popFront при создании диапазона.
Исключения:
DateTimeException, если этот интервал пуст.

Предупреждение: Функция func должна быть логически чистой. В идеале она была бы указателем на чистую (pure) функцию, но требование чистоты функции func сильно ограничивало бы её применение, и для удобства использования функций, которые генерируют функции для передачи в fwdRange, func должна быть делегатом.

Если функция func сохраняет состояние, которое изменяется при её вызовах, то некоторые алгоритмы будут работать некорректно, потому что при этом метод сохранения диапазона save не позволил бы на самом деле сохранить состояние диапазона. Чтобы избежать таких ошибок, не передавайте в fwdRange делегат, не являющийся логически чистым. Если func получает одинаковые отметки времени в двух разных вызовах, она оба раза должна вернуть одинаковый результат.
Конечно, ни у одной из функций в этом модуле нет таких проблем, поэтому сказанное относится только к созданию пользовательских делегатов.

Пример:

auto interval = Interval!Date(Date(2010, 9, 1), Date(2010, 9, 9));
auto func = delegate (in Date date) //Для итераций по чётным дням.
            {
                if ((date.day & 1) == 0)
                    return date + dur!"days"(2);

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

 //Нечётный день. Использование Yes.popFirst дало бы здесь 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);

Как-то недоделали делегат в этом примере... Если на вход подаётся 30-е число, а в месяце 31 день, как например, Date(2010, 10, 30), то в результате вернётся 1-е число следующего месяца. т.е., чтобы возращались только чётные числа, нужно ещё учесть этот случай – прим.пер.

const IntervalRange!(TP, Direction.bwd) bwdRange(TP delegate(in TP) func, PopFirst popFirst = No.popFirst);
Возвращает диапазон, который выполняет итерации над интервалом назад, начиная от end, используя функцию func для генерации каждой следующей отметки времени.
Первое значение front у диапазона равно концу интервала. func используется для генерации следующего значения front при вызове popFront. Если параметр popFirst равен Yes.popFirst, то popFront вызывается до возврата диапазона (чтобы значение front стало отметкой времени, сгенерированной функцией func).
Если func когда-либо сгенерирует отметку времени, равную текущему значению front диапазона или более позднюю, тогда будет выброшено исключение DateTimeException. Диапазон станет пустым, и итерации завершатся, когда func сгенерирует отметку времени, равную началу интервала или более раннюю.
В этом модуле есть вспомогательные функции, генерирующие частоиспользуемые делегаты для передачи в функцию bwdRange. Их документация начинается с фразы «Генерирующая функция диапазона», что делает их легко доступными для поиска.
Параметры:
TP delegate(in TP) func Функция, используемая для генерации отметок времени диапазона по интервалу.
PopFirst popFirst Следует ли сразу вызвать popFront при создании диапазона.
Исключения:
DateTimeException, если этот интервал пуст.

Предупреждение: Функция func должна быть логически чистой. В идеале она была бы указателем на чистую (pure) функцию, но требование чистоты функции func сильно ограничивало бы её применение, и для удобства использования функций, которые генерируют функции для передачи в bwdRange, func должна быть делегатом.

Если функция func сохраняет состояние, которое изменяется при её вызовах, то некоторые алгоритмы будут работать некорректно, потому что при этом метод сохранения диапазона save не позволил бы на самом деле сохранить состояние диапазона. Чтобы избежать таких ошибок, не передавайте в bwdRange делегат, не являющийся логически чистым. Если func получает одинаковые отметки времени в двух разных вызовах, она оба раза должна вернуть одинаковый результат.
Конечно, ни у одной из функций в этом модуле нет таких проблем, поэтому сказанное относится только к созданию пользовательских делегатов.

Пример:

auto interval = Interval!Date(Date(2010, 9, 1), Date(2010, 9, 9));
auto func = delegate (in Date date) //Для итераций по чётным дням.
            {
                if ((date.day & 1) == 0)
                    return date - dur!"days"(2);

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

//Нечётный день. Использование Yes.popFirst дало бы здесь 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 string toString();
Преобразует этот интервал в строку.

Переместиться к: begin · contains · empty · expand · fwdRange · intersection · intersects · isAdjacent · isAfter · isBefore · merge · opAssign · shift · span · this · toString

struct PosInfInterval(TP);
Представляет интервал времени, у которого концом является положительная бесконечность.
Любые диапазоны, которые итерируют по PosInfInterval, являются бесконечными. Таким образом, основная цель использования PosInfInterval – создание бесконечного диапазона, который начинается в фиксированный момент времени и переходит в положительную бесконечность.
pure nothrow this(in TP begin);
Параметры:
TP begin Отметка времени начала интервала.

Пример:

auto interval = PosInfInterval!Date(Date(1996, 1, 2));

Переместиться к: 2

pure nothrow ref PosInfInterval opAssign(ref const PosInfInterval rhs);
Параметры:
PosInfInterval rhs PosInfInterval для присвоения этому экземпляру.
pure nothrow ref PosInfInterval opAssign(PosInfInterval rhs);
Параметры:
PosInfInterval rhs PosInfInterval для присвоения этому экземпляру.

Переместиться к: 2

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);

Переместиться к: 2 · 3 · 4

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(in Interval!TP interval);
Находится ли заданный интервал полностью внутри этого интервала.
Параметры:
Interval!TP interval Интервал, для которого проверяется включение в этот интервал.
Исключения:
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(in 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(in NegInfInterval!TP interval);
Находится ли заданный интервал полностью внутри этого интервала.
Всегда возвращает false, потому что интервал, идущий в положительную бесконечность, никогда не может содержать интервал, начинающийся с отрицательной бесконечности.
Параметры:
NegInfInterval!TP interval Интервал, для которого проверяется включение в этот интервал.

Пример:

assert(!PosInfInterval!Date(Date(1996, 1, 2)).contains(
            NegInfInterval!Date(Date(1996, 5, 4))));

Переместиться к: 2 · 3 · 4

const pure nothrow bool isBefore(in 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(in Interval!TP interval);
Находится ли этот интервал до заданного интервала, при этом не пересекаясь с ним.
Всегда возвращает false (если заданный интервал не пуст), потому что интервал, идущий в положительную бесконечность, не может находиться до какого-либо другого интервала.
Параметры:
Interval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
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(in 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(in NegInfInterval!TP interval);
Находится ли этот интервал до заданного интервала, при этом не пересекаясь с ним.
Всегда возвращает false, потому что интервал, идущий в положительную бесконечность, не может находиться до какого-либо другого интервала.
Параметры:
NegInfInterval!TP interval Интервал для сравнения с этим интервалом.

Пример:

assert(!PosInfInterval!Date(Date(1996, 1, 2)).isBefore(
            NegInfInterval!Date(Date(1996, 5, 4))));

Переместиться к: 2 · 3 · 4

const pure nothrow bool isAfter(in 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(in Interval!TP interval);
Находится ли этот интервал после заданного интервала, при этом не пересекаясь с ним.
Параметры:
Interval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
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(in 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(in 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))));

Переместиться к: 2 · 3

const pure bool intersects(in Interval!TP interval);
Пересекаются ли заданный интервал с этим интервалом.
Параметры:
Interval!TP interval Интервал, для которого проверяется наличие пересечения с этим интервалом.
Исключения:
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(in 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(in 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))));

Переместиться к: 2 · 3

const Interval!TP intersection(in Interval!TP interval);
Возвращает пересечение двух интервалов.
Параметры:
Interval!TP interval Интервал, пересекающийся с этим интервалом.
Исключения:
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(in 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(in NegInfInterval!TP interval);
Возвращает пересечение двух интервалов.
Параметры:
NegInfInterval!TP interval Интервал, пересекающийся с этим интервалом.
Исключения:
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)));

Переместиться к: 2 · 3

const pure bool isAdjacent(in Interval!TP interval);
Примыкает ли заданный интервал к этому интервалу.
Параметры:
Interval!TP interval Интервал, который надо проверить, примыкает ли он к этому интервалу.
Исключения:
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(in 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(in 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))));

Переместиться к: 2

const PosInfInterval merge(in Interval!TP interval);
Возвращает объединение двух интервалов.
Параметры:
Interval!TP interval Интервал для слияния с этим интервалом.
Исключения:
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(in 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)));

Переместиться к: 2

const pure PosInfInterval span(in Interval!TP interval);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов.
Параметры:
Interval!TP interval Интервал, создающий span вместе с этим интервалом.
Исключения:
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(in PosInfInterval interval);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов.
Параметры:
PosInfInterval interval Интервал, создающий span вместе с этим интервалом.

Замечание: Не существует перегрузки для 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)));

Переместиться к: 2

pure nothrow void shift(D)(D duration)
if (__traits(compiles, begin + duration));
Сдвигает начало интервала вперёд или назад во времени на заданную длительность 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 = Yes.allowDayOverflow)
if (isIntegral!T);
Сдвигает начало интервала вперёд или назад во времени на заданное количество лет и/или месяцев (положительное количество лет и месяцев сдвигает интервал вперёд, отрицательное число сдвигает его назад). Он добавляет годы и месяцы к begin. Фактически, вызывается add!"years"(), и затем add!"months"() для начала интервала с заданным количеством лет и месяцев.
Параметры:
T years Количество лет, на которое сдвигается интервал.
T months Количество месяцев, на которое сдвигается интервал.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня для begin, что может привести к увеличению месяца.
Исключения:
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)));

Переместиться к: 2

pure nothrow void expand(D)(D duration)
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 = Yes.allowDayOverflow)
if (isIntegral!T);
Расширяет интервал назад во времени. Фактически он вычитает заданное количество months/years от begin.
Параметры:
T years Количество лет, на которое расширяется интервал.
T months Количество месяцев, на которое расширяется интервал.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня для begin, что может привести к увеличению месяца.
Исключения:
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(in TP) func, PopFirst popFirst = No.popFirst);
Возвращает диапазон, который выполняет итерации над интервалом вперёд, начиная от begin, используя функцию func для генерации каждой следующей отметки времени.
Первое значение front у диапазона равно началу интервала. func используется для генерации следующего значения front при вызове popFront. Если параметр popFirst равен Yes.popFirst, то popFront вызывается до возврата диапазона (чтобы значение front стало отметкой времени, сгенерированной функцией func).
Если func когда-либо сгенерирует отметку времени, равную текущему значению front диапазона или более раннюю, тогда будет выброшено исключение DateTimeException.
В этом модуле есть вспомогательные функции, генерирующие частоиспользуемые делегаты для передачи в функцию fwdRange. Их документация начинается с фразы «Генерирующая функция диапазона», что делает их легко доступными для поиска.
Параметры:
TP delegate(in TP) func Функция, используемая для генерации отметок времени диапазона по интервалу.
PopFirst popFirst Следует ли сразу вызвать popFront при создании диапазона.
Исключения:
DateTimeException, если этот интервал пуст.

Предупреждение: Функция func должна быть логически чистой. В идеале она была бы указателем на чистую (pure) функцию, но требование чистоты функции func сильно ограничивало бы её применение, и для удобства использования функций, которые генерируют функции для передачи в fwdRange, func должна быть делегатом.

Если функция func сохраняет состояние, которое изменяется при её вызовах, то некоторые алгоритмы будут работать некорректно, потому что при этом метод сохранения диапазона save не позволил бы на самом деле сохранить состояние диапазона. Чтобы избежать таких ошибок, не передавайте в fwdRange делегат, не являющийся логически чистым. Если func получает одинаковые отметки времени в двух разных вызовах, она оба раза должна вернуть одинаковый результат.
Конечно, ни у одной из функций в этом модуле нет таких проблем, поэтому сказанное относится только к созданию пользовательских делегатов.

Пример:

auto interval = PosInfInterval!Date(Date(2010, 9, 1));
auto func = delegate (in Date date) //Для итераций по чётным дням.
            {
                if ((date.day & 1) == 0)
                    return date + dur!"days"(2);

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

//Нечётный день. Использование Yes.popFirst дало бы здесь 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();
Преобразует этот интервал в строку.

Переместиться к: bwdRange · contains · empty · end · expand · intersection · intersects · isAdjacent · isAfter · isBefore · merge · opAssign · shift · span · this · toString

struct NegInfInterval(TP);
Представляет интервал времени, начинающийся с отрицательной бесконечности.
Любые диапазоны, которые итерируют по NegInfInterval, являются бесконечными. Таким образом, основная цель использования NegInfInterval – создать бесконечный диапазон, который начинается с отрицательной бесконечности и заканчивается в фиксированном моменте времени. Итерации над ним ведутся в обратном порядке.
pure nothrow this(in TP end);
Параметры:
TP end Отметка времени, в которой интервал заканчивается.

Пример:

auto interval = PosInfInterval!Date(Date(1996, 1, 2));

Переместиться к: 2

pure nothrow ref NegInfInterval opAssign(ref const NegInfInterval rhs);
Параметры:
NegInfInterval rhs NegInfInterval для присвоения этому экземпляру.
pure nothrow ref NegInfInterval opAssign(NegInfInterval rhs);
Параметры:
NegInfInterval rhs NegInfInterval для присвоения этому экземпляру.

Переместиться к: 2

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);

Переместиться к: 2 · 3 · 4

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(in Interval!TP interval);
Находится ли заданный интервал полностью внутри этого интервала.
Параметры:
Interval!TP interval Интервал, для которого проверяется включение в этот интервал.
Исключения:
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(in 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(in 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))));

Переместиться к: 2 · 3 · 4

const pure nothrow bool isBefore(in 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(in Interval!TP interval);
Находится ли этот интервал до заданного интервала, при этом не пересекаясь с ним.
Параметры:
Interval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
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(in 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(in 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))));

Переместиться к: 2 · 3 · 4

const pure nothrow bool isAfter(in 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(in Interval!TP interval);
Находится ли этот интервал после заданного интервала, при этом не пересекаясь с ним.
Всегда возвращает false, потому что интервал, начинающийся с отрицательной бесконечности, никогда не может находиться после какого-либо другого интервала.
Параметры:
Interval!TP interval Интервал для сравнения с этим интервалом.
Исключения:
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(in 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(in 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))));

Переместиться к: 2 · 3

const pure bool intersects(in Interval!TP interval);
Пересекаются ли заданный интервал с этим интервалом.
Параметры:
Interval!TP interval Интервал, для которого проверяется наличие пересечения с этим интервалом.
Исключения:
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(in 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(in 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))));

Переместиться к: 2 · 3

const Interval!TP intersection(in Interval!TP interval);
Возвращает пересечение двух интервалов.
Параметры:
Interval!TP interval Интервал, пересекающийся с этим интервалом.
Исключения:
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(in PosInfInterval!TP interval);
Возвращает пересечение двух интервалов.
Параметры:
PosInfInterval!TP interval Интервал, пересекающийся с этим интервалом.
Исключения:
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(in 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)));

Переместиться к: 2 · 3

const pure bool isAdjacent(in Interval!TP interval);
Примыкает ли заданный интервал к этому интервалу.
Параметры:
Interval!TP interval Интервал, который надо проверить, примыкает ли он к этому интервалу.
Исключения:
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(in 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(in 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))));

Переместиться к: 2

const NegInfInterval merge(in Interval!TP interval);
Возвращает объединение двух интервалов.
Параметры:
Interval!TP interval Интервал для слияния с этим интервалом.
Исключения:
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(in 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)));

Переместиться к: 2

const pure NegInfInterval span(in Interval!TP interval);
Возвращает интервал, который заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры:
Interval!TP interval Интервал, создающий span вместе с этим интервалом.
Исключения:
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(in NegInfInterval interval);
Возвращает интервал, который заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры:
NegInfInterval interval Интервал, создающий span вместе с этим интервалом.

Замечание: Не существует перегрузки для 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)));

Переместиться к: 2

pure nothrow void shift(D)(D duration)
if (__traits(compiles, end + duration));
Сдвигает конец интервала вперёд или назад во времени на заданную длительность duration (положительная длительность сдвигает интервал вперёд, отрицательная длительность сдвигает его назад). Фактически, получается end += duration.
Параметры:
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 = Yes.allowDayOverflow)
if (isIntegral!T);
Сдвигает конец интервала вперёд или назад во времени на заданное количество лет и/или месяцев (положительное количество лет и месяцев сдвигает интервал вперёд, отрицательное число сдвигает его назад). Он добавляет годы и месяцы к end. Фактически, вызывается add!"years"(), и затем add!"months"() для конца интервала с заданным количеством лет и месяцев.
Параметры:
T years Количество лет, на которое сдвигается интервал.
T months Количество месяцев, на которое сдвигается интервал.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня для end, что может привести к увеличению месяца.
Исключения:
DateTimeException, если результирующий интервал будет недействительным.

Пример:

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)));

Переместиться к: 2

pure nothrow void expand(D)(D duration)
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 = Yes.allowDayOverflow)
if (isIntegral!T);
Расширяет интервал вперёд во времени. Фактически он прибавляет заданное количество months/years к end.
Параметры:
T years Количество лет, на которое расширяется интервал.
T months Количество месяцев, на которое расширяется интервал.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня для end, что может привести к увеличению месяца.
Исключения:
DateTimeException, если результирующий интервал будет недействительным.

Пример:

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(in TP) func, PopFirst popFirst = No.popFirst);
Возвращает диапазон, который выполняет итерации над интервалом назад, начиная от end, используя функцию func для генерации каждой следующей отметки времени.
Первое значение front у диапазона равно концу интервала. func используется для генерации следующего значения front при вызове popFront. Если параметр popFirst равен Yes.popFirst, то popFront вызывается до возврата диапазона (чтобы значение front стало отметкой времени, сгенерированной функцией func).
Если func когда-либо сгенерирует отметку времени, равную текущему значению front диапазона или более позднюю, тогда будет выброшено исключение DateTimeException.
В этом модуле есть вспомогательные функции, генерирующие частоиспользуемые делегаты для передачи в функцию bwdRange. Их документация начинается с фразы «Генерирующая функция диапазона», что делает их легко доступными для поиска.
Параметры:
TP delegate(in TP) func Функция, используемая для генерации отметок времени диапазона по интервалу.
PopFirst popFirst Следует ли сразу вызвать popFront при создании диапазона.
Исключения:
DateTimeException, если этот интервал пуст.

Предупреждение: Функция func должна быть логически чистой. В идеале она была бы указателем на чистую (pure) функцию, но требование чистоты функции func сильно ограничивало бы её применение, и для удобства использования функций, которые генерируют функции для передачи в fwdRange, func должна быть делегатом.

Если функция func сохраняет состояние, которое изменяется при её вызовах, то некоторые алгоритмы будут работать некорректно, потому что при этом метод сохранения диапазона save не позволил бы на самом деле сохранить состояние диапазона. Чтобы избежать таких ошибок, не передавайте в fwdRange делегат, не являющийся логически чистым. Если func получает одинаковые отметки времени в двух разных вызовах, она оба раза должна вернуть одинаковый результат.
Конечно, ни у одной из функций в этом модуле нет таких проблем, поэтому сказанное относится только к созданию пользовательских делегатов.

Пример:

auto interval = NegInfInterval!Date(Date(2010, 9, 9));
auto func = delegate (in Date date) //Для итераций по чётным дням.
            {
                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)); //Нечётный день. Использование Yes.popFirst дало бы здесь 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(in TP) everyDayOfWeek(TP, Direction dir = Direction.fwd)(DayOfWeek dayOfWeek)
if (isTimePoint!TP && (dir == Direction.fwd || dir == Direction.bwd) && __traits(hasMember, TP, "dayOfWeek") && !__traits(isStaticFunction, TP.dayOfWeek) && is(typeof(TP.dayOfWeek) == DayOfWeek));
Генерирующая функция диапазона.
Возвращает делегат, который в диапазоне возвращает следующий момент времени с данным днём недели.
Использование этого делегата позволяет выполнять итерацию по последовательным отметкам времени, которые относятся к одному и тому же дню недели, например, передача DayOfWeek.mon в everyDayOfWeek приведёт к тому, что делегат будет использоваться для итерации по всем понедельникам в диапазоне.
Параметры:
dir Направление для итерации. При передаче возвращаемого значения в функцию fwdRange используйте Direction.fwd. При его передаче в функцию bwdRange, используйте Direction.bwd.
DayOfWeek dayOfWeek День недели, который будет определять каждую отметку времени в диапазоне.
В этой и всех остальных генерирующих функциях диапазона почему-то не описанный здесь шаблонный параметр TP (тип отметки времени) является обязательным. Если написать так:
interval.fwdRange(everyDayOfWeek(DayOfWeek.mon));
– то это вызовет ошибку компиляции. Нужно писать
interval.fwdRange(everyDayOfWeek!Date(DayOfWeek.mon));
– прим. пер.
TP delegate(in TP) everyMonth(TP, Direction dir = Direction.fwd)(int month)
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 для создания делегата.
Поскольку на самом деле не имеет смысла выполнять итерации за определённый месяц, но в конечном итоге в некоторые из отметок времени оказаться в следующем месяце или через два года после предыдущей отметки времени, при вычислении следующей отметки времени всегда используется No.allowDayOverflow.
Параметры:
dir Направление для итерации. При передаче возвращаемого значения в функцию fwdRange используйте Direction.fwd. При его передаче в функцию bwdRange, используйте Direction.bwd.
int month Месяц, в котором каждый раз будет находиться отметка времени диапазона.

Переместиться к: 2

nothrow TP delegate(in TP) everyDuration(TP, Direction dir = Direction.fwd, D)(D duration)
if (isTimePoint!TP && __traits(compiles, TP.init + duration) && (dir == Direction.fwd || dir == Direction.bwd));
Генерирующая функция диапазона.
Возвращает делегат, который возвращает следующую отметку времени, которая находится позже заданной на заданную длительность.
Использование этого делегата даёт возможность итерировать по последовательным отметкам времени, которые отстоят друг от друга на заданную длительность, например, передача аргумента dur!"days"(3) в everyDuration приведёт к тому, что делегат будет использоваться для итерации по диапазону из дней, которые находятся друг от друга на расстоянии 3 дня.
Параметры:
dir Направление для итерации. При передаче возвращаемого значения в функцию fwdRange используйте Direction.fwd. При его передаче в функцию bwdRange, используйте Direction.bwd.
D duration Длительность, которая отделяет каждую последующую отметку времени в диапазоне.
nothrow TP delegate(in TP) everyDuration(TP, Direction dir = Direction.fwd, D)(int years, int months = 0, AllowDayOverflow allowOverflow = Yes.allowDayOverflow, D duration = dur!"days"(0))
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"(), и, наконец, к ней прибавляется duration. Однако, если итерирование ведётся в обратную сторону, сначала прибавляется duration, а затем вызывается add!"months"(), и, наконец, вызывается add!"years"(). Таким образом, движение назад генерирует близкие результаты к тем отметкам времени, что и при итерациях вперёд, но поскольку операция прибавления лет и месяцев не является полностью обратимой (из-за возможного переполнения дня, в зависимости от того, используется ли Yes.allowDayOverflow или No.allowDayOverflow), не гарантируется, что выполнение итераций назад даст те же отметки времени, что и выпонение итераций вперёд (даже если предположить, что конец диапазона – это отметка времени, которая будет возвращена делегатом в начале итерации вперёд).
Параметры:
dir Направление для итерации. При передаче возвращаемого значения в функцию fwdRange используйте Direction.fwd. При его передаче в функцию bwdRange, используйте Direction.bwd.
int years Количество лет, прибавляемых к моменту времени, передаваемому в делегат.
int months Количество месяцев, прибавляемых к моменту времени, передаваемому в делегат.
AllowDayOverflow allowOverflow Разрешено ли переполнение дня в begin и end, что может заставить месяц увеличиться.
D duration Длительность для прибавления к моменту времени, передаваемому в делегат.

Переместиться к: direction · empty · front · func · interval · opAssign · popFront · save

struct IntervalRange(TP, Direction dir) if (isTimePoint!TP && dir != Direction.both);
Диапазон, итерирующий по интервалу Interval.
IntervalRange создаётся только из интервала. Однако, при построении ему присваивается функция func, которая используется для создания отметок времени, по которым проводятся итерации. func принимает отметку времени и возвращает отметку времени того же типа. Например, чтобы перебрать все дни в интервале Interval!Date, передайте функцию в метод интервала fwdRange, где эта функция будет принимать дату и возвращать дату, соответствующую следующему дню. Затем эта функция будет использоваться методом popFront структуры IntervalRange для итерирования по датам в интервале.
Если dir == Direction.fwd, то диапазон итерирует вперёд во времени, тогда как если dir == Direction.bwd, то итерации происходят назад во времени. Итак, если dir == Direction.fwd, то front == interval.begin, тогда как если dir == Direction.bwd, то front == interval.end. Функция func должна генерировать отметку времени, находящуюся в правильном направлении по итерации, или сгенерируется исключение DateTimeException. Итак, чтобы итератировать вперёд во времени, момент времени, который сгенерирует func, должен быть позже по времени, чем тот, который был ей передан. Если же он равен или раньше во времени, тогда будет выброшено исключение DateTimeException. Для итерации в обратную сторону сгенерированная отметка времени должна находиться до отметки времени, которая была передана.
Если сгенерированная отметка времени когда-либо пройдёт границу диапазона в правильном направлении, тогда вместо неё используется край этого диапазона. Итак, если итерация ведётся вперёд, а сгенерированная отметка времени проходит через конец интервала, то front становится равен концу. Если итерация ведётся назад и сгенерированная отметка времени находится перед началом интервала, тогда front станет равен началу. В любом случае диапазон станет пустым.
Также обратите внимание, что, хотя обычно начало интервала включается в него, а его конец, наоборот, исключается из него, если dir == Direction.bwd, тогда начало считается исключённым, а конец считается включённым. Это даёт одно и то же поведение в обоих направлениях. Это работает, потому что ни одна из функций структуры Interval, для которых важно, включено или исключено начало или конец, никогда не вызывается из IntervalRange. Метод interval возвращает нормальный интервал, независимо от того, чему равно dir, Direction.fwd или Direction.bwd, поэтому любые вызываемые функции структуры Interval, для которых важно, включены ли или исключены из интервала начало или конец, будут рассматривать начало включённым, а конец исключённым.
pure nothrow ref IntervalRange opAssign(ref IntervalRange rhs);

pure nothrow ref IntervalRange opAssign(IntervalRange rhs);
Параметры:
IntervalRange rhs IntervalRange, присваеваемый этому экземпляру.
const pure nothrow @property bool empty();
Является ли этот IntervalRange пустым.
const pure @property TP front();
Первая отметка времени в диапазоне.
Исключения:
DateTimeException, если диапазон пуст.
void popFront();
Выталкивает front из диапазона, используя функцию func для генерации следующей отметки времени в диапазоне. Если генерируемая отметка времени находится за пределами края диапазона, то значению front присваивается этот край, а диапазон становится пустым. Таким образом, если итерации ведётся вперёд, а сгенерированная отметка времени больше, чем конец интервала, тогда значение front устанавливается в конец. Если итерации ведутся назад, а сгенерированная отметка времени меньше начала интервала, то значение front устанавливается в начало.
Исключения:
DateTimeException, если диапазон пуст, или если сгенерированная отметка времени оказалась неверно расположена (то есть, если итерации ведутся вперёд, а сгенерированная отметка времени находится раньше значения front, или итерации ведутся назад, а сгенерированная отметка времени находится после значения front).
pure nothrow @property IntervalRange save();
Возвращает копию this.
const pure nothrow @property Interval!TP interval();
Интервал, по которому проходит этот IntervalRange.
pure nothrow @property TP delegate(in TP) func();
Функция, используемая для генерации следующей отметки времени в диапазоне.
const pure nothrow @property Direction direction();
Направление, в котором этот диапазон итерирует.

Переместиться к: empty · front · func · interval · opAssign · popFront · save

struct PosInfIntervalRange(TP) if (isTimePoint!TP);
Диапазон, итерирующий по интервалу PosInfInterval. Это бесконечный диапазон.
PosInfIntervalRange создаётся только из интервала PosInfInterval. Однако, при построении ему присваивается функция func, которая используется для создания отметок времени, по которым проводятся итерации. func принимает отметку времени и возвращает отметку времени того же типа. Например, чтобы перебрать все дни в интервале PosInfInterval!Date, передайте функцию в метод интервала fwdRange, где эта функция будет принимать дату и возвращать дату, соответствующую следующему дню. Затем эта функция будет использоваться методом popFront структуры PosInfIntervalRange для итерирования по датам в интервале – хотя, очевидно, поскольку диапазон бесконечен, используйте его с функцией, подобной std.range.take, а не выполняйте итерации по всем датам.
Поскольку интервал направлен в положительную бесконечность, диапазон всегда итерирует вперёд, а не назад. func должна генерировать отметку времени, находящуюся в правильном направлении по итерации, или сгенерируется исключение DateTimeException. Таким образом, моменты времени, которые генерирует func, должны быть позже во времени, чем те, что были ей переданы. Если же он равен или раньше во времени, тогда будет выброшено исключение DateTimeException.
pure nothrow ref PosInfIntervalRange opAssign(ref PosInfIntervalRange rhs);

pure nothrow ref PosInfIntervalRange opAssign(PosInfIntervalRange rhs);
Параметры:
PosInfIntervalRange rhs PosInfIntervalRange, присваеваемый этому экземпляру.
enum bool empty;
Это бесконечный диапазон, поэтому он никогда не бывает пустым.
const pure nothrow @property TP front();
Первая отметка времени в диапазоне.
void popFront();
Выталкивает front из диапазона, используя функцию func для генерации следующей отметки времени в диапазоне.
Исключения:
DateTimeException, если сгенерированная отметка времени меньше, чем front.
pure nothrow @property PosInfIntervalRange save();
Возвращает копию this.
const pure nothrow @property PosInfInterval!TP interval();
Интервал, по которому проходит этот диапазон.
pure nothrow @property TP delegate(in TP) func();
Функция, используемая для генерации следующей отметки времени в диапазоне.

Переместиться к: empty · front · func · interval · opAssign · popFront · save

struct NegInfIntervalRange(TP) if (isTimePoint!TP);
Диапазон, итерирующий по интервалу NegInfInterval. Это бесконечный диапазон.
NegInfIntervalRange создаётся только из интервала NegInfInterval. Однако, при построении ему присваивается функция func, которая используется для создания отметок времени, по которым проводятся итерации. func принимает отметку времени и возвращает отметку времени того же типа. Например, чтобы перебрать все дни в интервале NegInfInterval!Date, передайте функцию в метод интервала bwdRange, где эта функция будет принимать дату и возвращать дату, соответствующую более раннему дню. Затем эта функция будет использоваться методом popFront структуры NegInfIntervalRange для итерирования по датам в интервале – хотя, очевидно, поскольку диапазон бесконечен, используйте его с функцией, подобной std.range.take, а не выполняйте итерации по всем датам.
Поскольку интервал направлен в отрицательную бесконечность, диапазон всегда итерирует назад, а не вперёд. func должна генерировать отметку времени, находящуюся в правильном направлении по итерации, или сгенерируется исключение DateTimeException. Таким образом, моменты времени, которые генерирует func, должны быть раньше во времени, чем те, что были ей переданы. Если же он равен или позже во времени, тогда будет выброшено исключение DateTimeException.
Также обратите внимание, что, хотя обычно конец интервала исключается из него, NegInfIntervalRange рассматривает его так, как если бы он был включён. Это даёт такое же поведение, что и в случае PosInfIntervalRange. Это работает, потому что ни одна из функций структуры NegInfInterval, для которых важно, включён или исключён конец, не вызывается из NegInfIntervalRange. Метод interval возвращает нормальный интервал, поэтому любые вызываемые на него функции структуры NegInfInterval, для которых важно, включён или исключён конец, будут рассматривать конец, как исключённый.
pure nothrow ref NegInfIntervalRange opAssign(ref NegInfIntervalRange rhs);

pure nothrow ref NegInfIntervalRange opAssign(NegInfIntervalRange rhs);
Параметры:
NegInfIntervalRange rhs NegInfIntervalRange для присвоения этому экземпляру.
enum bool empty;
Это бесконечный диапазон, поэтому он никогда не бывает пустым.
const pure nothrow @property TP front();
Первая отметка времени в диапазоне.
void popFront();
Выталкивает front из диапазона, используя функцию func для генерации следующей отметки времени в диапазоне.
Исключения:
DateTimeException, если сгенерированная отметка времени больше, чем front.
pure nothrow @property NegInfIntervalRange save();
Возвращает копию this.
const pure nothrow @property NegInfInterval!TP interval();
Интервал, по которому проходит этот диапазон.
pure nothrow @property TP delegate(in TP) func();
Функция, используемая для генерации следующей отметки времени в диапазоне.

Переместиться к: dstInEffect · dstName · getInstalledTZNames · getTimeZone · hasDST · name · stdName · tzToUTC · utcOffsetAt · utcToTZ

abstract class TimeZone;
Представляет часовой пояс. Он используется со структурой SysTime для указания часового пояса SysTime.
const nothrow @property @safe string name();
Название часового пояса в базе данных часовых поясов (TZ Database). Это название используется для получения TimeZone по имени с помощью TimeZone.getTimeZone.
Смотрите также:
const nothrow @property @safe string stdName();
Как правило, аббревиатура (обычно 3 или 4 буквы) для часового пояса, когда DST (переход на летнее время) не действует (например, PST). Она не обязательно уникальна.
Тем не менее, в Windows это может быть несокращённое имя (например, Pacific Standard Time). Несмотря на это, это не то же самое, что и название name.
const nothrow @property @safe string dstName();
Как правило, аббревиатура (обычно 3 или 4 буквы) для часового пояса, когда действует DST (например, PDT). Она не обязательно уникальна.
Тем не менее, в Windows это может быть несокращённое имя (например, Pacific Daylight Time). Несмотря на это, это не то же самое, что и название name.
abstract const nothrow @property @safe bool hasDST();
Имеет ли этот Часовой пояс Летнее время в любой момент времени. Whether this time zone has Daylight Savings Time at any point in time. Обратите внимание, что для некоторых типов часовых поясов он может не иметь DST для текущих дат, но всё равно будет возвращать true для hasDST, потому что часовой пояс в какой-то момент имел DST.
abstract const nothrow @safe bool dstInEffect(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и возвращает, действует ли DST в этом часовом поясе в этот момент времени.
Параметры:
long stdTime UTC-время, которое необходимо проверить на наличие перехода на Летнее время в этом часовом поясе.
abstract const nothrow @safe long utcToTZ(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и преобразует его во время этого часового пояса.
Параметры:
long stdTime UTC-время, которое необходимо установить во время этого часового пояса.
abstract const nothrow @safe long tzToUTC(long adjTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в этом времени и переводит его в UTC-время (т.е. стандартное время).
Параметры:
long adjTime Время в этом часовом поясе, которое нужно перевести в UTC-время.
const nothrow @safe Duration utcOffsetAt(long stdTime);
Возвращает величину смещения от UTC для заданного времени. Включает в себя DST-смещение, действующее на тот момент (если есть).
Параметры:
long stdTime UTC-время для получения величины смещения от UTC для этого часового пояса.
deprecated static @safe immutable(TimeZone) getTimeZone(string name);
Устаревшее. Используйте PosixTimeZone.getTimeZone или WindowsTimeZone.getTimeZone (можно использовать parseTZConversions для преобразования имён часовых поясов, если необходимо). Microsoft слишком часто меняет свои часовые пояса, чтобы мы могли скомпилировать преобразования в Phobos и обеспечить их надлежащее обновление. TimeZone.getTimeZone будет удалено в июле 2017 года.
Возвращает TimeZone с данным именем в базе данных часовых поясов (TZ Database).
Возвращает PosixTimeZone в системах Posix и WindowsTimeZone в системах Windows. Для получения PosixTimeZone в Windows вызовите PosixTimeZone.getTimeZone напрямую и укажите местоположение файлов часовых поясов базы данных часовых поясов на диске.
В Windows данное название из базы данных часовых поясов преобразуется в соответствующее название часового пояса в Windows до вызова WindowsTimeZone.getTimeZone. Эта функция позволяет использовать одинаковые названия часовых поясов как в Windows, так и в системах Posix.
Параметры:
string name Название нужного часового пояса в базе данных часовых поясов
Исключения:
DateTimeException, если данный часовой пояс не найден.
Примеры:
auto tz = TimeZone.getTimeZone("America/Los_Angeles");
deprecated static @safe string[] getInstalledTZNames(string subName = "");
Устаревшее. Используйте либо PosixTimeZone.getInstalledTZNames, либо WindowsTimeZone.getInstalledTZNames (можно использовать parseTZConversions для преобразования имён часовых поясов, если необходимо). Microsoft слишком часто меняет свои часовые пояса, чтобы мы могли скомпилировать преобразования в Phobos и обеспечить их надлежащее обновление. TimeZone.getInstalledTZNames будет удалено в июле 2017 года.
Возвращает список имён часовых поясов, установленных в системе.
Предоставление подзаголовка subName сужает список часовых поясов (которых могут быть тысячи). Например, при передаче "America" в качестве подзаголовка, возвращаются только часовые пояса, начинающиеся с "America".
В Windows эта функция преобразует названия часовых поясов Windows в соответствующие названия базы данных часовых поясов (TZ Database) с помощью windowsTZNameToTZDatabaseName. Чтобы получить действительные названия часовых поясов Windows, используйте WindowsTimeZone.getInstalledTZNames напрямую.
Параметры:
string subName Первая часть названия требуемых часовых поясов.
Исключения:
FileException в системах Posix, если не получается прочитать с диска. DateTimeException в системах Windows, если не получается прочитать реестр.

Переместиться к: dstInEffect · dstName · hasDST · name · opCall · stdName · tzToUTC · utcToTZ

class LocalTime: std.datetime.TimeZone;
TimeZone, который представляет текущий локальный часовой пояс в системе, на которой запущена ваша программа.
Использует базовые C-вызовы для настройки времени, вместо использования D-специфичного кода, основанного на системных настройках, для вычисления времени, такого как PosixTimeZone и WindowsTimeZone. Это также означает, что будет использоваться текущий часовой пояс в системе, даже если часовой пояс системы изменяется во время работы программы.
static pure nothrow @trusted immutable(LocalTime) opCall();
LocalTime – это класс-синглтон. LocalTime возвращает свой единственный экземпляр.
const nothrow @property @safe string name();
Название часового пояса в базе данных часовых поясов (TZ Database). Это название используется для получения TimeZone по имени с помощью TimeZone.getTimeZone.
Обратите внимание, что всегда возвращается пустая строка. Это связано с тем, что часовые пояса нельзя однозначно идентифицировать по атрибутам, данным ОС (например, stdName и dstName), и ни системы Posix, ни системы Windows не предоставляют простого способа получить название в базе данных часовых поясов для локального часового пояса.
Смотрите также:
const nothrow @property @trusted string stdName();
Как правило, аббревиатура (обычно 3 или 4 буквы) для часового пояса, когда DST (переход на летнее время) не действует (например, PST). Она не обязательно уникальна.
Тем не менее, в Windows это может быть несокращённое имя (например, Pacific Standard Time). Несмотря на это, это не то же самое, что и название name.
Это свойство переопределено, поскольку локальное время системы может меняться во время работы программы, и нам нужно определять его динамически, а не фиксировать, как это было бы с большинством других часовых поясов.
const nothrow @property @trusted string dstName();
Как правило, аббревиатура (обычно 3 или 4 буквы) для часового пояса, когда действует DST (например, PDT). Она не обязательно уникальна.
Тем не менее, в Windows это может быть несокращённое имя (например, Pacific Daylight Time). Несмотря на это, это не то же самое, что и название name.
Это свойство переопределено, поскольку локальное время системы может меняться во время работы программы, и нам нужно определять его динамически, а не фиксировать, как это было бы с большинством других часовых поясов.
const nothrow @property @trusted bool hasDST();
Имеет ли этот Часовой пояс Летнее время в любой момент времени. Whether this time zone has Daylight Savings Time at any point in time. Обратите внимание, что для некоторых типов часовых поясов он может не иметь DST для текущих дат, но всё равно будет возвращать true для hasDST, потому что часовой пояс в какой-то момент имел DST.
const nothrow @trusted bool dstInEffect(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и возвращает, действует ли DST в этом часовом поясе в этот момент времени.
Параметры:
long stdTime UTC-время, которое необходимо проверить на наличие перехода на Летнее время в этом часовом поясе.
const nothrow @trusted long utcToTZ(long stdTime);
Возвращает количество hnsec в локальном часовом поясе, используя стандартные вызовы C-функций в системах Posix и стандартные системные вызовы Windows в системах Windows, чтобы получить время в соответствующем часовом поясе из стандартного времени.
Параметры:
long stdTime UTC-время, которое необходимо установить во время этого часового пояса.
Смотрите также:
TimeZone.utcToTZ
const nothrow @trusted long tzToUTC(long adjTime);
Возвращает стандартное время, используя стандартные вызовы C-функций в системах Posix и стандартные системные вызовы Windows в системах Windows, чтобы получить значение UTC-времени из времени соответствующего часового пояса.
Смотрите также:
TimeZone.tzToUTC
Параметры:
long adjTime Время в этом часовом поясе, которое нужно перевести в UTC-время.

Переместиться к: dstInEffect · hasDST · opCall · tzToUTC · utcOffsetAt · utcToTZ

class UTC: std.datetime.TimeZone;
Часовой пояс TimeZone, который представляет UTC.
static pure nothrow @safe immutable(UTC) opCall();
UTC – это класс-синглтон. UTC возвращает свой единственный экземпляр.
const nothrow @property @safe bool hasDST();
Всегда возвращает false.
const nothrow @safe bool dstInEffect(long stdTime);
Всегда возвращает false.
const nothrow @safe long utcToTZ(long stdTime);
Возвращает переданное количество hnsecs, не изменяя их.
Параметры:
long stdTime UTC-время, которое необходимо установить во время этого часового пояса.
Смотрите также:
TimeZone.utcToTZ
const nothrow @safe long tzToUTC(long adjTime);
Возвращает переданное количество hnsecs, не изменяя их.
Смотрите также:
TimeZone.tzToUTC
Параметры:
long adjTime Время в этом часовом поясе, которое нужно перевести в UTC-время.
const nothrow @safe Duration utcOffsetAt(long stdTime);
Возвращет core.time.Duration со значением 0.
Параметры:
long stdTime UTC-время для получения величины смещения от UTC для этого часового пояса.

Переместиться к: dstInEffect · hasDST · this · tzToUTC · utcOffset · utcOffsetAt · utcToTZ

class SimpleTimeZone: std.datetime.TimeZone;
Представляет часовой пояс со смещением от UTC (в минутах, в западном полушарии запад - отрицательные), но без перехода на летнее время (DST).
В основном используется в качестве часового пояса, получающегося как результат методов fromISOString, fromISOExtString и fromSimpleString структуры SysTime.
name и dstName всегда возвращают пустую строку, так как этот часовой пояс не имеет DST, и, хотя он может предназначаться для представления часового пояса, находящегося в базе данных часовых поясов (TZ Database), очевидно, что он вряд ли будет в точности следовать правилам любого из часовых поясов в базе данных часовых поясов, поэтому нет смысла их устанавливать.
const nothrow @property @safe bool hasDST();
Всегда возвращает false.
const nothrow @safe bool dstInEffect(long stdTime);
Всегда возвращает false.
const nothrow @safe long utcToTZ(long stdTime);
Принимает количество hnsecs (100 нс), прошедших от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и преобразует его во время этого часового пояса.
Параметры:
long stdTime UTC-время, которое необходимо установить во время этого часового пояса.
const nothrow @safe long tzToUTC(long adjTime);
Принимает количество hnsecs (100 нс), прошедших от полуночи, 1 января, 1 года нашей эры по времени этого часового пояса и преобразует его в UTC (т.е. в стандартное время).
Параметры:
long adjTime Время в этом часовом поясе, которое необходимо преобразовать во время UTC.
const nothrow @safe Duration utcOffsetAt(long stdTime);
Возвращает смещение от UTC в виде core.time.Duration.
Параметры:
long stdTime UTC-время для получения величины смещения от UTC для этого часового пояса.
immutable pure @safe this(Duration utcOffset, string stdName = "");
Параметры:
Duration utcOffset Смещение этого часового пояса от UTC, в случае западного полушария является отрицательным (оно прибавляется к UTC, чтобы получить заданное время).
string stdName stdName для этого часового пояса.
const pure nothrow @property @safe Duration utcOffset();
Смещение времени от UTC (отрицательное значение к западу от UTC, положительное – к востоку).

Переместиться к: defaultTZDatabaseDir · dstInEffect · getInstalledTZNames · getTimeZone · hasDST · tzToUTC · utcToTZ

class PosixTimeZone: std.datetime.TimeZone;
Представляет часовой пояс из файла базы данных часовых поясов (TZ Database). Файлы из базы данных часовых поясов – это то, как Posix-системы содержат информацию о часовом поясе. К сожалению, Windows не использует базу данных часовых поясов. Для её использования, применяйте в Windows PosixTimeZone (который считывает информацию из файлов базы данных часовых поясов на диске), предоставляя файлы базы данных часовых поясов и сообщая функции PosixTimeZone.getTimeZone, где находится каталог с этими файлами.
Чтобы получить PosixTimeZone, вызовите функцию PosixTimeZone.getTimeZone (которая позволяет указать местоположение файлов часовых поясов) или вызовите TimeZone.getTimeZone (которая предоставит PosixTimeZone в системах Posix и WindowsTimeZone в системах Windows).

Замечание: Если локальный часовой пояс вашей системы не связан с секундами координации (что крайне маловероятно), то единственным способом получить часовой пояс, который учитывает секунды координации, является использование PosixTimeZone с часовым поясом, имя которого начинается с "right/". Эти файлы часовых поясов включают в себя секунды координации, а PosixTimeZone учитывает их (хотя posix-системы, которые используют часовой пояс "right/" в качестве своего локального часового пояса, не учитывают секунды координации, даже если они находятся в файле).

const nothrow @property @safe bool hasDST();
Имеет ли этот Часовой пояс Летнее время в любой момент времени. Whether this time zone has Daylight Savings Time at any point in time. Обратите внимание, что для некоторых типов часовых поясов он может не иметь DST для текущих дат, но всё равно будет возвращать true для hasDST, потому что часовой пояс в какой-то момент имел DST.
const nothrow @safe bool dstInEffect(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и возвращает, действует ли DST в этом часовом поясе в этот момент времени.
Параметры:
long stdTime UTC-время, которое необходимо проверить на наличие перехода на Летнее время в этом часовом поясе.
const nothrow @safe long utcToTZ(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и преобразует его во время этого часового пояса.
Параметры:
long stdTime UTC-время, которое необходимо установить во время этого часового пояса.
const nothrow @safe long tzToUTC(long adjTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в этом времени и переводит его в UTC-время (т.е. стандартное время).
Параметры:
long adjTime Время в этом часовом поясе, которое нужно перевести в UTC-время.
enum string defaultTZDatabaseDir;
Каталог по умолчанию, в котором находятся файлы базы данных часовых поясов. Он пуст для Windows, так как в Windows их нет.
static @trusted immutable(PosixTimeZone) getTimeZone(string name, string tzDatabaseDir = defaultTZDatabaseDir);
Возвращает объект TimeZone по указанному имени из базы данных часовых поясов (TZ Database). Информация о часовом поясе извлекается из файлов базы данных часовых поясов в заданном каталоге.
Параметры:
string name Название нужного часового пояса в базе данных часовых поясов
string tzDatabaseDir Каталог, в котором находятся файлы базы данных часовых поясов. Поскольку эти файлы отсутствуют в системах Windows, предоставьте их и укажите здесь их местоположение, чтобы использовать класс PosixTimeZone.
Исключения:
DateTimeException, если данный часовой пояс не найден, или FileException, если файл базы данных часовых поясов не получается открыть.
Примеры:
version(Posix)
{
    auto tz = PosixTimeZone.getTimeZone("America/Los_Angeles");

    assert(tz.name == "America/Los_Angeles");
    assert(tz.stdName == "PST");
    assert(tz.dstName == "PDT");
}
static @trusted string[] getInstalledTZNames(string subName = "", string tzDatabaseDir = defaultTZDatabaseDir);
Возвращает список имён часовых поясов, установленных в системе.
Предоставление подзаголовка subName сужает список часовых поясов (которых могут быть тысячи). Например, при передаче "America" в качестве подзаголовка, возвращаются только часовые пояса, начинающиеся с "America".
Параметры:
string subName Первая часть названия требуемых часовых поясов.
string tzDatabaseDir Каталог, в котором находятся файлы базы данных часовых поясов.
Исключения:
FileException, если он не читается с диска.

Переместиться к: dstInEffect · getInstalledTZNames · getTimeZone · hasDST · tzToUTC · utcToTZ

class WindowsTimeZone: std.datetime.TimeZone;
Этот класс только для Windows.
Представляет часовой пояс из реестра Windows. К сожалению, Windows не использует базу данных часовых поясов (TZ Database). Для её использования, применяйте в Windows PosixTimeZone (который считывает информацию из файлов базы данных часовых поясов на диске), предоставляя файлы базы данных часовых поясов и сообщая функции PosixTimeZone.getTimeZone, где находится каталог с этими файлами.
Файлы базы данных часовых поясов и информация о часовых поясах в Windows часто не совпадают. В Windows присутствует множество ошибок в отношении того, когда происходят переходы на летнее время (особенно для исторических дат). Кроме того, файлы базы данных часовых поясов содержат гораздо больше часовых поясов, чем Windows. Таким образом, для получения точной информации о часовом поясе используйте файлы базы данных часовых поясов с помощью класса PosixTimeZone вместо WindowsTimeZone. Однако, поскольку класс WindowsTimeZone использует системные вызовы Windows для работы со временем, гораздо более вероятно, что он будет соответствовать поведению других Windows-программ. Помните о различиях при выборе метода.
WindowsTimeZone не существует в системах Posix.
Чтобы получить объект WindowsTimeZone, вызовите функцию WindowsTimeZone.getTimeZone или TimeZone.getTimeZone (которая предоставляет объект PosixTimeZone в системах Posix и WindowsTimeZone в системах Windows).
Смотрите также:
const nothrow @property @safe bool hasDST();
Имеет ли этот Часовой пояс Летнее время в любой момент времени. Whether this time zone has Daylight Savings Time at any point in time. Обратите внимание, что для некоторых типов часовых поясов он может не иметь DST для текущих дат, но всё равно будет возвращать true для hasDST, потому что часовой пояс в какой-то момент имел DST.
const nothrow @safe bool dstInEffect(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и возвращает, действует ли DST в этом часовом поясе в этот момент времени.
Параметры:
long stdTime UTC-время, которое необходимо проверить на наличие перехода на Летнее время в этом часовом поясе.
const nothrow @safe long utcToTZ(long stdTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в UTC (т.е. стандартное время) и преобразует его во время этого часового пояса.
Параметры:
long stdTime UTC-время, которое необходимо установить во время этого часового пояса.
const nothrow @safe long tzToUTC(long adjTime);
Принимает количество hnsecs (100 нс) от полуночи, 1 января, 1 года нашей эры в этом времени и переводит его в UTC-время (т.е. стандартное время).
Параметры:
long adjTime Время в этом часовом поясе, которое нужно перевести в UTC-время.
static @safe immutable(WindowsTimeZone) getTimeZone(string name);
Возвращает объект TimeZone с заданным именем согласно именованию часовых поясов в Windows. Информация о часовом поясе извлекается из реестра Windows.
Параметры:
string name Название нужного часового пояса в реестре Windows.
Исключения:
DateTimeException, если заданный часовой пояс не найден.

Пример:

auto tz = WindowsTimeZone.getTimeZone("Pacific Standard Time");

static @safe string[] getInstalledTZNames();
Возвращает список названий часовых поясов, установленных в системе. Список, возвращаемый WindowsTimeZone, содержит имена часовых поясов в Windows, а не имена из базы данных часовых поясов. Тем не менее, TimeZone.getinstalledTZNames вернёт имена базы данных часовых поясов, которые эквивалентны именам часовых поясов в Windows.
nothrow @safe void setTZEnvVar(string tzDatabaseName);
Эта функция только для систем Posix.
Устанавливает локальный часовой пояс в системах Posix с именем в базе данных часовых поясов (TZ Database), устанавливая переменную окружения TZ.
К сожалению, не существует способа сделать это в Windows с использованием имени из базы данных часовых поясов, поэтому эта функция существует только в системах Posix.
nothrow @safe void clearTZEnvVar();
Эта функция только для систем Posix.
Очищает системную переменную TZ.

Переместиться к: fromWindows · toWindows

struct TZConversions;

pure @safe TZConversions parseTZConversions(string windowsZonesXMLText);
Предоставляет преобразования между именами зон часовых поясов базы данных IANA (которые используются системами POSIX) и именами часовых поясов, которые используются в Windows.
Windows использует набор имён часовых поясов, отличающийся от часовых поясов базы данных IANA, и то, как они согласуются друг с другом со временем (особенно, когда Microsoft обновляет Windows). Файл windowsZones.xml предоставляет текущие преобразования (которые могут совпадать или не совпадать с тем, что находится в определенной системе Windows, в зависимости от того, насколько она обновлена), а parseTZConversions читает эти преобразования из windowsZones.xml, чтобы программа на D могла использовать эти преобразования.
Однако следует отметить, что информация о часовых поясах в Windows часто менее точна, чем в базе данных часовых поясов IANA, и если кто-то действительно хочет получить точную информацию о часовом поясе, он должен использовать файлы базы данных часовых поясов IANA с помощью PosixTimeZone в Windows вместо WindowsTimeZone, тогда как WindowsTimeZone имеет смысл при попытке соответствовать тому, что будет подразумевать Windows о том, в каком конкретно часовом поясе находится текущее время.
Кроме того, в базе данных часовых поясов IANA присутсвует намного больше часовых поясов, чем в Windows.
Параметры:
Исключения:
Исключение, если случилась ошибка при разборе данного XML.
    // Разбор преобразований из локального файла.
    auto text = std.file.readText("path/to/windowsZones.xml");
    auto conversions = parseTZConversions(text);

    // Как альтернатива, загрузите XML-файл из Интернета во время выполнения 
    // и проанализируйте, чтобы гарантировать его актуальность,
    // но недостаток такого подхода в том, что появляется зависимость
    // от работоспособности сайта unicode.org или от изменения URL.
    auto url = "http://unicode.org/cldr/data/common/supplemental/windowsZones.xml";
    auto conversions2 = parseTZConversions(std.net.curl.get(url));
Мне кажется, что описания массивов toWindows и fromWindows перепутаны между собой, судя по тексту. Для уверенности я попробовал следующее:
conversions.toWindows["America/Anchorage"]
возвращает
["Alaskan Standard Time"]
, вроде как это название из Windows, а
conversions.fromWindows["Hawaiian Standard Time"]
возвращает
["Etc/GMT+10", "Pacific/Honolulu", "Pacific/Johnston", "Pacific/Rarotonga", "Pacific/Tahiti"]
, вроде как это названия из базы IANA (или я не прав?) – доп. пер.
string[][string] toWindows;
Ключом является имя часового пояса в Windows, а значение представляет собой список имён базы данных часовых поясов IANA, которые ему соответствуют (в настоящее время только одно значение, но допустимы множественные случаи, если это когда-либо понадобится).
string[][string] fromWindows;
Ключом является имя в базе данных часовых поясов IANA, а значением – список имён часовых поясов в Windows, которые ему соответствуют (обычно только один, но возможны несколько).
deprecated pure nothrow @nogc @safe string tzDatabaseNameToWindowsTZName(string tzName);
Устаревшее. Вместо этого используйте parseTZConversions. Microsoft слишком часто меняет свои часовые пояса, чтобы мы могли скомпилировать преобразования в Phobos и обеспечить их надлежащее обновление. tzDatabaseNameToWindowsTZName будет удалено в июле 2017 года.
Преобразует переданное имя в базе данных часовых поясов (TZ Database) в соответствующее имя часового пояса Windows.
Обратите внимание, что в некоторых случаях имя в базе данных часовых поясов соответствует двум различным именам часовых поясов Windows. Таким образом, в то время как в большинстве случаев преобразование из одного в другое и обратно снова приведёт к тому же названию часового пояса, с которого начались преобразования, в небольшом количестве случаев возможно получить другое название.
Кроме того, существует гораздо больше названий в базе данных часовых поясов, чем часовых поясов Windows, поэтому некоторые из достаточно экзотических названий в базе данных не имеют соответствующих названий среди часовых поясов Windows.
Возвращает null, если переданное имя часового пояса не может быть преобразовано.
Параметры:
string tzName Название в базе данных часовых поясов для преобразования.
deprecated pure nothrow @nogc @safe string windowsTZNameToTZDatabaseName(string tzName);
Устаревшее. Вместо этого используйте parseTZConversions. Microsoft слишком часто меняет свои часовые пояса, чтобы мы могли скомпилировать преобразования в Phobos и обеспечить их надлежащее обновление. windowsTZNameToTZDatabaseName будет удалено в июле 2017 года.
Преобразует данное имя часового пояса Windows в соответствующее имя в базе данных часовых поясов (TZ Database).
Возвращает null, если переданное имя часового пояса не может быть преобразовано.
Параметры:
string tzName Название часового пояса Windows для преобразования.

Переместиться к: opEquals · peek · reset · running · setMeasured · start · stop · this

struct StopWatch;
StopWatch (секундомер) измеряет время как можно точнее.
Эта структура использует высокопроизводительный счетчик. В системах Windows он использует QueryPerformanceCounter, а в системах Posix использует clock_gettime, если он доступен, и gettimeofday в противном случае.
Но точность секундомера StopWatch отличается от системы к системе. Невозможно, чтобы она была одинаковой в различных системах, поскольку точность системных часов варьируется от системы к системе, а также что-либо другое, зависящее от системы и от ситуации (например, накладные расходы на переключение контекста между потоками), также может влиять на точность StopWatch.
Примеры:
Начиная с версии 2.075 (когда модуль std.datetime разделили на части), структура StopWatch была переписана на основе использования структур core.time.MonoTime и core.time.Duration вместо структуры core.time.TickDuration. Поэтому этот пример не будет работать в новых версиях, надо брать примеры из документации к ним – прим.пер.
void writeln(S...)(S args){}
static void bar() {}

StopWatch sw;
enum n = 100;
TickDuration[n] times;
TickDuration last = TickDuration.from!"seconds"(0);
foreach (i; 0..n)
{
   sw.start(); //начать/возобновить измерение.
   foreach (unused; 0..1_000_000)
       bar();
   sw.stop();  //остановить/приостановить измерение.
   //Возвращаемое значение peek() после остановки всегда одинаково.
   writeln((i + 1) * 1_000_000, " times done, lap time: ",
           sw.peek().msecs, "[ms]");
   times[i] = sw.peek() - last;
   last = sw.peek();
}
real sum = 0;
// Чтобы получить количество секунд, 
// используйте свойства TickDuration.
// (seconds, msecs, usecs, hnsecs)
foreach (t; times)
   sum += t.hnsecs;
writeln("Average time: ", sum/n, " hnsecs");
@nogc @safe this(AutoStart autostart);
Автоматический запуск с помощью конструктора.
const pure nothrow @nogc @safe bool opEquals(const StopWatch rhs);

const pure nothrow @nogc @safe bool opEquals(ref const StopWatch rhs);
@nogc @safe void reset();
Сбрасывает секундомер.
Примеры:
StopWatch sw;
sw.start();
sw.stop();
sw.reset();
assert(sw.peek().to!("seconds", real)() == 0);
@nogc @safe void start();
Старт секундомера.
@nogc @safe void stop();
Остановка секундомера.
const @nogc @safe TickDuration peek();
Прочитать время, прошедшее с момента запуска секундомера.
@nogc @safe void setMeasured(TickDuration d);
Установить время, которое было измерено с момента запуска секундомера.
const pure nothrow @nogc @property @safe bool running();
Подтверждает, измеряет ли этот секундомер время в настоящий момент.
TickDuration[fun.length] benchmark(fun...)(uint n);
Определение эффективности кода для оценки скорости и сравнения.
Параметры:
fun Псевдонимы вызываемых объектов (например, имена функций). Каждый из них не должен принимать никаких аргументов.
uint n Сколько раз каждая функция должна быть выполнена.
Возвращает:
Количество времени (в виде core.time.TickDuration), которое потребовалось для вызова каждой функции n раз. Первое значение – это время, которое потребовалось на n вызовов fun[0]. Второе значение - это время, затраченное на вызов fun[1] n раз. И т.д.
Обратите внимание, что преобразование TickDuration в core.time.Duration облегчит работу с результатами (и это может измениться в будущем, когда шаблон benchmark будет возвращать массив из Duration вместо TickDuration).
Смотрите также:
Примеры:
import std.conv : to;
int a;
void f0() {}
void f1() {auto b = a;}
void f2() {auto b = to!string(a);}
auto r = benchmark!(f0, f1, f2)(10_000);
auto f0Result = to!Duration(r[0]); // время, потребовавшееся f0 на выполнение 10000 раз
auto f1Result = to!Duration(r[1]); // время, потребовавшееся f1 на выполнение 10000 раз
auto f2Result = to!Duration(r[2]); // время, потребовавшееся f2 на выполнение 10000 раз

Переместиться к: baseTime · point · targetTime

struct ComparingBenchmarkResult;
Возвращаемое значение функции comparingBenchmark, сравнивающей производительность двух функций.
const pure nothrow @property @safe real point();
Значение оценки
Возвращает значение оценки сравнения как отношения времени выполнения базовой функции baseFunc ко времени выполнения целевой функции targetFunc. Если производительность целевой функции высокая, возвращается большое значение.
const pure nothrow @property @safe TickDuration baseTime();
Время, требуемое для базовой функции
const pure nothrow @property @safe TickDuration targetTime();
Время, требуемое для целевой функции
ComparingBenchmarkResult comparingBenchmark(alias baseFunc, alias targetFunc, int times = 4095)();
Сравнение производительности двух функций.
Параметры:
baseFunc Функция, которая представит базовую скорость.
targetFunc Функция, у которой мы хотим измерить скорость.
times Сколько раз должна быть выполнена каждая из функций.
Примеры:
void f1x() {}
void f2x() {}
@safe void f1o() {}
@safe void f2o() {}
auto b1 = comparingBenchmark!(f1o, f2o, 1)(); // OK
//writeln(b1.point);
enum auto isTimePoint(T);
Определяет ли данный тип все необходимые функции, чтобы функционировать в качестве отметки времени.
1. T должен определить статическое свойство с именем min, которое является наименьшим значением T.
2. T должен определить статическое свойство с именем max, которое является наибольшим значением T.
3. В T должен быть определён метод opBinary для сложения и вычитания, который принимает core.time.Duration и возвращает Unqual!T.
4. В T должен быть определён метод opOpAssign для сложения и вычитания, который принимает core.time.Duration и возвращает ref Unqual!T.
5. В T должен быть определён метод opBinary для вычитания, который принимает T и возвращает core.time.Duration.
Примеры:
static assert(isTimePoint!Date);
static assert(isTimePoint!DateTime);
static assert(isTimePoint!SysTime);
static assert(isTimePoint!TimeOfDay);

static assert(!isTimePoint!int);
static assert(!isTimePoint!Duration);
static assert(!isTimePoint!(Interval!SysTime));
static pure nothrow @safe bool yearIsLeapYear(int year);
Является ли переданный григорианский год високосным годом.
Параметры:
int year Проверяемый год.
pure nothrow @safe long unixTimeToStdTime(long unixTime);
Преобразует дату-время из unix time (в котором используется полночь, 1 января 1970 UTC как начало эпохи и секунды в качестве единиц) в "std time" (в котором 0 используется для обозначения полночи, 1 января, 1 года нашей эры UTC, и hnsecs в качестве единиц).
В стандарте C не указывается представление time_t, поэтому он определяется реализацией. В системах POSIX, unix time эквивалентно time_t, но это не обязательно верно для других систем (например, это неверно для среды исполнения Digital Mars C). Поэтому будьте осторожны при использовании unix time с C-функциями в системах, отличных от POSIX.
Эпоха "std time" основывается на Пролептическом григорианском календаре в соответствии с ISO 8601, и это то, что SysTime использует внутри себя. Однако, время хранится в виде целого числа hnescs, так как эта эпоха технически не является частью стандарта на самом деле, так как она основана на нём, поэтому название "std time" не слишком хорошо, но для него нет официального названия. C# использует "ticks" для того же самого, но они фактически не являются тиками часов, а термин "ticks" используется для действительных тиков часов в core.time.MonoTime, поэтому не имеет смысла использовать термин "ticks" здесь. Итак, к лучшему или худшему, std.datetime использует для этого термин "std time".
Параметры:
long unixTime Unix time для преобразования.
Смотрите также:
SysTime.fromUnixTime
Примеры:
// Полночь, 1 января 1970 года
assert(unixTimeToStdTime(0) == 621_355_968_000_000_000L);
assert(SysTime(unixTimeToStdTime(0)) ==
       SysTime(DateTime(1970, 1, 1), UTC()));

assert(unixTimeToStdTime(int.max) == 642_830_804_470_000_000L);
assert(SysTime(unixTimeToStdTime(int.max)) ==
       SysTime(DateTime(2038, 1, 19, 3, 14, 07), UTC()));

assert(unixTimeToStdTime(-127_127) == 621_354_696_730_000_000L);
assert(SysTime(unixTimeToStdTime(-127_127)) ==
       SysTime(DateTime(1969, 12, 30, 12, 41, 13), UTC()));
pure nothrow @safe T stdTimeToUnixTime(T = time_t)(long stdTime)
if (is(T == int) || is(T == long));
Преобразует дату-время из std time (в котором используется полночь, 1 января, 1 года нашей эры UTC как начало эпохи, и hnsecs в качестве единиц) в unix time (в котором используется полночь, 1 января 1970 UTC как начало эпохи и секунды в качестве единиц).
В стандарте C не указывается представление time_t, поэтому он определяется реализацией. В системах POSIX, unix time эквивалентно time_t, но это не обязательно верно для других систем (например, это неверно для среды исполнения Digital Mars C). Поэтому будьте осторожны при использовании unix time с C-функциями в системах, отличных от POSIX.
Эпоха "std time" основывается на Пролептическом григорианском календаре в соответствии с ISO 8601, и это то, что SysTime использует внутри себя. Однако, время хранится в виде целого числа hnescs, так как эта эпоха технически не является частью стандарта на самом деле, так как она основана на нём, поэтому название "std time" не слишком хорошо, но для него нет официального названия. C# использует "ticks" для того же самого, но они фактически не являются тиками часов, а термин "ticks" используется для действительных тиков часов в core.time.MonoTime, поэтому не имеет смысла использовать термин "ticks" здесь. Итак, к лучшему или худшему, std.datetime использует для этого термин "std time".
По умолчанию возвращаемым типом является time_t (который обычно является псевдонимом для int в 32-разрядных системах и long в 64-битных системах), но если требуется другой размер, чем int или long, его можно передать аргументом шаблона для получения желаемого размера.
Если тип возвращаемого значения – это int, и результат не может быть помещён в int, тогда будет использоваться самое близкое значение, которое может быть сохранено в 32 битах (таким образом это будет int.max, если он превышен, и int.min, если результат ещё меньше). Однако не предпринимается никаких попыток справиться с переполнением целых чисел, если тип возврата long.
Параметры:
T Тип возвращаемого значения (int или long). По умолчанию используется значение time_t, которое обычно составляет 32 бита в 32-разрядной системе и 64 бита в 64-разрядной системе.
long stdTime Преобразуемое значение std time.
Возвращает:
Знаковое целое число, представляющее unix time, которое эквивалентно заданному std time.
Смотрите также:
SysTime.toUnixTime
Примеры:
// Полночь, 1 января 1970 года UTC
assert(stdTimeToUnixTime(621_355_968_000_000_000L) == 0);

// 2038-01-19 03:14:07 UTC
assert(stdTimeToUnixTime(642_830_804_470_000_000L) == int.max);
@safe SysTime SYSTEMTIMEToSysTime(const SYSTEMTIME* st, immutable TimeZone tz = LocalTime());
Эта функция только для Windows.
Преобразует структуру SYSTEMTIME в SysTime.
Параметры:
SYSTEMTIME* st Структура SYSTEMTIME для преобразования.
TimeZone tz Часовой пояс, в котором находится время в структуре SYSTEMTIME (если SYSTEMTIME было предоставлено системным вызовом Windows, в SYSTEMTIME будет либо в локальное время, либо время в формате UTC, в зависимости от вызова).
Исключения:
DateTimeException, если переданное значение SYSTEMTIME не будет вписываться в допустимые значения SysTime, что вряд ли произойдёт, учитывая, что SysTime.max находится в 29 228 году нашей эры, а максимум SYSTEMTIME - в 30 827 году нашей эры.
@safe SYSTEMTIME SysTimeToSYSTEMTIME(in SysTime sysTime);
Эта функция только для Windows.
Преобразует SysTime в структуру SYSTEMTIME.
Возвращаемое значение SYSTEMTIME будет установлено с использованием часового пояса переданного SysTime, поэтому, чтобы получить значение SYSTEMTIME в UTC, установите часовой пояс SysTime в UTC.
Параметры:
SysTime sysTime SysTime для преобразования.
Исключения:
DateTimeException, если переданное значение SysTime не будет вписываться в SYSTEMTIME. Это произойдет только в случае, когда дата в SysTime раньше, чем 1601 г. н.э.
@safe long FILETIMEToStdTime(const FILETIME* ft);
Эта функция только для Windows.
Преобразует структуру FILETIME в количество hnsec, начиная от полуночи, 1 января, 1 года нашей эры.
Параметры:
FILETIME* ft Структура FILETIME для преобразования.
Исключения:
DateTimeException, если переданное значение FILETIME не может быть представлено как возвращаемое значение.
@safe SysTime FILETIMEToSysTime(const FILETIME* ft, immutable TimeZone tz = LocalTime());
Эта функция только для Windows.
Преобразует структуру FILETIME в SysTime.
Параметры:
FILETIME* ft Структура FILETIME для преобразования.
TimeZone tz Часовой пояс, в котором будет находиться SysTime (FILETIME находится в UTC).
Исключения:
DateTimeException, если переданное значение FILETIME не будет вписываться в SysTime.
@safe FILETIME stdTimeToFILETIME(long stdTime);
Эта функция только для Windows.
Преобразует число hnsec, прошедших от полуночи, 1 января, 1 года нашей эры в структуру FILETIME.
Параметры:
long stdTime количество hnsec, прошедших от полуночи, 1 января, 1 года нашей эры UTC.
Исключения:
DateTimeException, если заданное значение не будет вписываться в FILETIME.
@safe FILETIME SysTimeToFILETIME(SysTime sysTime);
Эта функция только для Windows.
Преобразует SysTime в структуру FILETIME.
FILETIME всегда находится в UTC.
Параметры:
SysTime sysTime Значение SysTime для преобразования.
Исключения:
DateTimeException, если данный SysTime не будет вписываться в FILETIME.
alias DosFileTime = uint;
Тип, представляющий формат даты/времени файла DOS.
@safe SysTime DosFileTimeToSysTime(DosFileTime dft, immutable TimeZone tz = LocalTime());
Преобразует из даты/времени файла DOS в SysTime.
Параметры:
DosFileTime dft Время DOS-файла для преобразования.
TimeZone tz Часовой пояс, в котором, как предполагается, находится время файла DOS.
Исключения:
DateTimeException, если DosFileTime недействителен.
@safe DosFileTime SysTimeToDosFileTime(SysTime sysTime);
Преобразует из SysTime в дату/время файла DOS.
Параметры:
SysTime sysTime SysTime для преобразования.
Исключения:
DateTimeException, если переданный SysTime не может быть преобразован в DosFileTime.
@safe SysTime parseRFC822DateTime()(in char[] value);

@safe SysTime parseRFC822DateTime(R)(R value)
if (isRandomAccessRange!R && hasSlicing!R && hasLength!R && (is(Unqual!(ElementType!R) == char) || is(Unqual!(ElementType!R) == ubyte)));
Ожидается, что заданный массив символов char или диапазон с произвольным доступом из символов char или ubyte будет в формате, указанном в разделе 3.3 RFC 5322 о правилах грамматики даты-времени. Это формат даты и времени, обычно используемый в интернет-сообщениях, таких как электронная почта и HTTP. Будет возвращен соответствующий SysTime.
RFC 822 было предыдущей спецификацией (отсюда и название функции), тогда как RFC 5322 является текущей спецификацией.
День недели игнорируется без проверки, является ли он действительным денём недели, так как день недели можно вывести из даты. Не проверяется, соответствует ли данный день недели фактическому дню недели заданной даты (хотя по спецификации это технически недопустимо, чтобы день недели не соответствовал фактическому дню недели заданной даты).
Если часовой пояс на входе "-0000" (или считается эквивалентным "-0000" согласно разделу 4.3 спецификации), то используется SimpleTimeZone со utc смещением 0, а не UTC, в то время как для "+0000" используется UTC.
Обратите внимание, что поскольку SysTime в настоящее время не поддерживает для секунд значение 60 (как это иногда делается для секунд координации), если в значении даты и времени секунды имеют значение 60, это значение считается равным 59.
Одно место, в котором эта функция нарушает RFC 5322, – она принимает "\n" в свёртке пробела вместо "\r\n", потому что это требуется спецификацией HTTP.
Исключения:
DateTimeException, если данная строка не соответствует грамматике для поля даты/времени, или если результирующий объект SysTime недействителен.
Примеры:
auto tz = new immutable SimpleTimeZone(hours(-8));
assert(parseRFC822DateTime("Sat, 6 Jan 1990 12:14:19 -0800") ==
       SysTime(DateTime(1990, 1, 6, 12, 14, 19), tz));

assert(parseRFC822DateTime("9 Jul 2002 13:11 +0000") ==
       SysTime(DateTime(2002, 7, 9, 13, 11, 0), UTC()));

auto badStr = "29 Feb 2001 12:17:16 +0200";
assertThrown!DateTimeException(parseRFC822DateTime(badStr));
pure nothrow @safe bool validTimeUnits(string[] units...);
Все ли строки, поданные на вход, являются допустимыми единицами времени.
"nsecs" не считается допустимой единицей времени. Ничто в модуле std.datetime не может действовать с точностью большей, чем hnsec, а несколько функций в модуле core.time, которые имеют дело с "nsecs", обрабатывают их явно.
pure @safe int cmpTimeUnits(string lhs, string rhs);
Сравнивает две строки с единицами времени. "years" (годы) - самые большие единицы, а "hnsecs" (сотни наносекунд) - самые маленькие.
Возвращает:
lhs < rhs < 0
lhs == rhs 0
lhs > rhs > 0
Исключения:
DateTimeException, если любая из поданных на вход строк не является допустимой строкой с единицей измерения времени.
template CmpTimeUnits(string lhs, string rhs) if (validTimeUnits(lhs, rhs))
Сравнивает две строки с единицами времени во время компиляции. "years" (годы) - самые большие единицы, а "hnsecs" (сотни наносекунд) - самые маленькие.
Этот шаблон используется вместо cmpTimeUnits, потому что во время компиляции не могут выбрасываться исключения, а cmpTimeUnits должен требовать, чтобы строки, полученные им, были действительными строками с единицами измерения времени. Вместо этого шаблон использует ограничение шаблона.
Возвращает:
this < rhs < 0
this == rhs 0
this > rhs > 0

Переместиться к: 2

pure nothrow @safe bool valid(string units)(int value)
if (units == "months" || units == "hours" || units == "minutes" || units == "seconds");
Возвращает, является ли данное значение действительным для данной единицы измерения времени в отметке времени. Естественно, что это касается не длительности, занимающей определённый диапазон, а значения в отметке времени (например, месяц должен быть в диапазоне от 1 до 12 включительно).
Параметры:
units Единицы времени для проверки.
int value Проверяемое число.
Примеры:
assert(valid!"hours"(12));
assert(!valid!"hours"(32));
assert(valid!"months"(12));
assert(!valid!"months"(13));
pure nothrow @safe bool valid(string units)(int year, int month, int day)
if (units == "days");
Возвращает, действительно ли данное значение day (день) для данных значений year (года) и month (месяца).
Параметры:
units Единицы времени для проверки.
int year Год, в котором проверяется день.
int month Месяц, в котором проверяется день.
int day Проверяемый день.

Переместиться к: 2

pure @safe void enforceValid(string units)(int value, string file = __FILE__, size_t line = __LINE__)
if (units == "months" || units == "hours" || units == "minutes" || units == "seconds");
Параметры:
units Единицы времени для проверки.
int value Проверяемое число.
string file Файл, в котором выброшено DateTimeException в списке исключений.
size_t line Номер строки, в которой выброшено DateTimeException в списке исключений.
Исключения:
DateTimeException, если valid!units(value) равно false.
pure @safe void enforceValid(string units)(int year, Month month, int day, string file = __FILE__, size_t line = __LINE__)
if (units == "days");
Параметры:
units Единицы времени для проверки.
int year Год, в котором проверяется день.
Month month Месяц, в котором проверяется день.
int day Проверяемый день.
string file Файл, в котором выброшено DateTimeException в списке исключений.
size_t line Номер строки, в которой выброшено DateTimeException в списке исключений.
Исключения:
DateTimeException, если valid!"days"(year, month, day) равно false.
static pure @safe int monthsToMonth(int currMonth, int month);
Возвращает количество месяцев между currMonth (текущий месяц) и month (заданный месяц). Если они совпадают, то результат равен 0.
Параметры:
int currMonth Текущий месяц года.
int month Месяц года для получения количества месяцев.
static pure nothrow @safe int daysToDayOfWeek(DayOfWeek currDoW, DayOfWeek dow);
Возвращает количество дней от текущего дня недели до заданного дня недели. Если они совпадают, то результат равен 0.
Параметры:
DayOfWeek currDoW Текущий день недели.
DayOfWeek dow День недели, чтобы получить количество дней.
auto measureTime(alias func)();
Функция для запуска времени секундомера при вызове функции и остановки его при выходе возвращаемого значения из области видимости и его уничтожении.
Когда значение, возвращаемое измеряемой функцией, будет уничтожено, будет запущена функция func. func – унарная функция, которая принимает core.time.TickDuration.

Пример:

{
    auto mt = measureTime!((TickDuration a)
        { /+ что-то сделать при выходе из области действия +/ });
    // сделать что-то, у чего нужно измерить время
}
что функционально эквивалентно
{
    auto sw = StopWatch(Yes.autoStart);
    scope(exit)
    {
        TickDuration a = sw.peek();
        /+ что-то сделать при выходе из области действия +/
    }
    // сделать что-то, у чего нужно измерить время
}

Смотрите также: