Этот модуль предоставляет:
- Типы для представления отметок во времени: SysTime, Date,
TimeOfDay, and DateTime.
- Типы для представления интервалов времени.
- Типы для представления диапазонов с интервалами времени.
- Типы представления часовых поясов (используются в SysTime).
- Платформонезависимый, высокоточный тип секундомера:
StopWatch
- Функции измерения производительности.
- Различные вспомогательные функции.
С модулем 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". Чтобы помнить, для каких единиц используется сокращение, а для каких нет: все единицы секунд и большие промежутки времени используют свои полные имена, а все единицы, меньшие, чем секунда, сокращены (поскольку они были бы довольно длинными, если бы это было не так).
Представляет 12 месяцев григорианского года (январь - это 1).
январь
февраль
март
апрель
май
июнь
июнь
август
сентябрь
октябрь
ноябрь
декабрь
Представляет 7 дней григорианской недели (воскресенье - это 0).
воскресенье
понедельник
вторник
среда
четверг
пятница
суббота
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, тогда переполнение допустимо.
Указывает направление во времени. Одним из примеров его использования является функция
expand структуры
Interval, в которой
Direction
используется для указания того, должен ли интервал расширяться назад (в прошлое), вперёд (в будущее) или в обе стороны.
Назад.
Вперёд.
Назад и вперёд.
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. Любое из них можно ловить, не заботясь о том, из какого модуля оно пришло.
Эффективное пространство имен, для понимания, что содержащиеся в нём методы получают время от системных часов. Запрещено создание экземпляра.
@safe SysTime
currTime
(ClockType clockType = ClockType.normal)(immutable TimeZone
tz
= LocalTime());
Возвращает текущее время в данном часовом поясе.
Parameters: clockType |
core.time.ClockType указывает, какие системные часы использовать для получения текущего времени. Очень немногим программам понадобится использовать что-либо вместо значения по умолчанию.
|
TimeZone tz |
Временной пояс для возвращаемого времени SysTime. |
@property @trusted long
currStdTime
(ClockType clockType = ClockType.normal)();
Возвращает количество hnsecs (гекто-наносекунд или 100 наносекунд) от полуночи, 1 января, 1 года н. э. до текущего момента.
Parameters: clockType |
core.time.ClockType указывает, какие системные часы использовать для получения текущего времени. Очень немногим программам понадобится использовать что-либо вместо значения по умолчанию. |
deprecated static nothrow @property @safe TickDuration
currSystemTick
();
-
Текущий номер тика системы. Количество тиков в секунду варьируется от системы к системе. currSystemTick
использует монотонные часы, поэтому он предназначен для точной синхронизации, сравнивая относительные значения времени, он не предназначен для получения текущего системного времени.
Предупреждение:
В некоторых системах монотонные часы могут перестать отсчитывать время, когда компьютер перейдёт в спящий режим или в гибернацию. Таким образом, если это произойдет, монотонные часы могут указывать на меньшее время, чем прошло фактически. Известно, что так происходит в Mac OS X. Не проверялось, происходит ли это в Windows или Linux.
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.
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 находится в данном часовом поясе. |
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. |
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
);
-
Обратите внимание, что часовой пояс игнорируется. Сравниваются только внутренние значения std time (которые находятся в формате UTC).
const pure nothrow @safe int
opCmp
(in SysTime
rhs
);
-
Часовой пояс не имеет значения при сравнении значений
SysTime.
Возвращает: this < rhs | < 0 |
this == rhs | 0 |
this > rhs | > 0 |
const pure nothrow @nogc @safe size_t
toHash
();
-
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 февраля.
const @property @safe ushort
yearBC
();
Год до н. э. по григорианскому календарю, считая год 0 первым годом до н. э.
Примеры: 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. |
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
не является допустимым значением месяца.
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
не является допустимым днём текущего месяца.
const nothrow @property @safe ubyte
hour
();
Час после полнуночи.
@property @safe void
hour
(int
hour
);
Присвоить час после полнуночи.
Parameters: int hour |
Значение часа, которое нужно установить в этом SysTime.
|
const nothrow @property @safe ubyte
minute
();
Значение минут текущего часа.
@property @safe void
minute
(int
minute
);
Присвоить значение минут текущего часа.
Parameters: int minute |
Значение минут, которое нужно установить в этом SysTime.
|
Исключения: DateTimeException,
если переданное значение
minute
не является допустимой минутой в часе.
const nothrow @property @safe ubyte
second
();
Значение секунд текущей минуты.
@property @safe void
second
(int
second
);
Присвоить значение секунд текущей минуты.
Parameters: int second |
Значение секунд, которое нужно установить в этом SysTime. |
Исключения: DateTimeException,
если переданное значение
second
не является допустимой секундой в минуте.
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));
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));
st.fracSecs = nsecs(123456789);
assert(st.fracSecs == hnsecs(1234567));
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. |
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 |
Допустимо ли переполнение дней, что заставит увеличиться месяц.
|
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)));
const pure nothrow @safe SysTime
opBinary
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
SysTime с использованием этого оператора:
SysTime | + | Duration | --> | SysTime |
SysTime | - | 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 == "-");
-
pure nothrow ref @safe SysTime
opOpAssign
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
SysTime с использованием этого оператора:
SysTime | + | Duration | --> | SysTime |
SysTime | - | Duration | --> | SysTime |
pure nothrow ref @safe SysTime
opOpAssign
(string op)(TickDuration
td
)
if (op == "+" || op == "-");
-
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 января – тоже один месяц.
Примеры: 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
();
-
const nothrow @property @safe ushort
dayOfYear
();
-
Примеры: 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.
|
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
();
Модифицированный
юлианский день для любого времени этой даты (так как модифицированный юлианский день меняется в полночь).
const nothrow @safe Date
opCast
(T)()
if (is(Unqual!T == Date));
-
const nothrow @safe DateTime
opCast
(T)()
if (is(Unqual!T == DateTime));
-
const nothrow @safe TimeOfDay
opCast
(T)()
if (is(Unqual!T == TimeOfDay));
-
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
();
-
@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 преобразование не выполняется).
|
@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 преобразование не выполняется). |
@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 преобразование не выполняется). |
static pure nothrow @property @safe SysTime
min
();
Возвращает самое раннее из всех возможных значений
SysTime.
Возвращаемое значение
SysTime находится в UTC.
static pure nothrow @property @safe SysTime
max
();
Возвращает самое позднее из всех возможных значений
SysTime.
Возвращаемое значение
SysTime находится в UTC.
-
Год, месяц и день хранятся внутри отдельно, так что
Date
оптимизирована для календарных операций.
Date
использует Пролептический григорианский календарь, поэтому он предполагает вычисления григорианского високосного года по всей своей длине. Согласно
ISO 8601, он трактует первый год до н.э. как год 0, то есть 1 год до н.э. является 0, второй считается как -1 и т.д. Используйте
yearBC для использования исчисления до Нашей Эры в виде положительного целого числа, где 1 год до н.э. считается годом, который был предыдущим перед 1 годом н.э.
Год 0 – високосный год.
pure @safe this(int
year
, int
month
, int
day
);
-
Параметры: 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
);
-
Возвращает: this < rhs | < 0 |
this == rhs | 0 |
this > rhs | > 0 |
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);
const pure @property @safe ushort
yearBC
();
Год григорианского календаря до Нашей Эры, с расчётом, что год 0 является первым годом до н.э.
Примеры: 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.
|
Примеры: auto date = Date(2010, 1, 1);
date.yearBC = 1;
assert(date == Date(0, 1, 1));
date.yearBC = 10;
assert(date == Date(-9, 1, 1));
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, если переданное значение месяца не является допустимым, или если текущий день недействителен в этом месяце.
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.
|
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));
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));
const pure nothrow @safe Date
opBinary
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
Date с использованием этого оператора:
Date | + | Duration | --> | Date |
Date | - | 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 == "-");
-
pure nothrow ref @safe Date
opOpAssign
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
Date с использованием этого оператора:
Date | + | Duration | --> | Date |
Date | - | Duration | --> | Date |
pure nothrow ref @safe Date
opOpAssign
(string op)(TickDuration
td
)
if (op == "+" || op == "-");
-
const pure nothrow @safe Duration
opBinary
(string op)(in Date
rhs
)
if (op == "-");
Дает разницу между двумя экземплярами
Date.
Допустимые типы арифметики для
Date с использованием этого оператора:
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
();
-
const pure nothrow @property @safe ushort
dayOfYear
();
-
Примеры: 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. |
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.
Представляет время суток с часами, минутами и секундами. Использует 24-часовое время.
pure @safe this(int
hour
, int
minute
, int
second
= 0);
Параметры: int hour |
Значение часа дня [0 - 24). |
int minute |
Значение минуты в часе [0 - 60). |
int second |
Значение секунды в минуте [0 - 60). |
const pure nothrow @safe int
opCmp
(in TimeOfDay
rhs
);
-
Возвращает: this < rhs | < 0 |
this == rhs | 0 |
this > rhs | > 0 |
const pure nothrow @property @safe ubyte
hour
();
Количество часов от полуночи.
pure @property @safe void
hour
(int
hour
);
Присвоить количество часов от полуночи.
Параметры: int hour |
Номер часа в сутках, устанавливаемый компоненту hour этого TimeOfDay.
|
const pure nothrow @property @safe ubyte
minute
();
Номер минуты в часе.
pure @property @safe void
minute
(int
minute
);
Присвоить номер минуты в часе.
Параметры: int minute |
Номер минуты в часе, устанавливаемый компоненту minute этого TimeOfDay.
|
const pure nothrow @property @safe ubyte
second
();
Номер секунды в минуте.
pure @property @safe void
second
(int
second
);
Присвоить номер секунды в минуте.
Параметры: int second |
Номер секунды в минуте, устанавливаемый компоненту 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));
const pure nothrow @safe TimeOfDay
opBinary
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
TimeOfDay с использованием этого оператора:
TimeOfDay | + | Duration | --> | TimeOfDay |
TimeOfDay | - | 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 == "-");
-
pure nothrow ref @safe TimeOfDay
opOpAssign
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
TimeOfDay с использованием этого оператора:
TimeOfDay | + | Duration | --> | TimeOfDay |
TimeOfDay | - | Duration | --> | TimeOfDay |
pure nothrow ref @safe TimeOfDay
opOpAssign
(string op)(TickDuration
td
)
if (op == "+" || op == "-");
-
const pure nothrow @safe Duration
opBinary
(string op)(in TimeOfDay
rhs
)
if (op == "-");
Даёт разницу между двумя экземплярами
TimeOfDay.
Допустимые типы арифметики для
TimeOfDay с использованием этого оператора:
TimeOfDay | - | TimeOfDay | --> | duration |
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
();
-
pure @safe TimeOfDay
fromISOString
(S)(in S
isoString
)
if (isSomeString!S);
Создаёт
TimeOfDay из строки с форматом HHMMSS. Пробелы удаляются из заданной строки.
Параметры: S isoString |
Строка, отформатированная в формате ISO для времени. |
pure @safe TimeOfDay
fromISOExtString
(S)(in S
isoExtString
)
if (isSomeString!S);
Создаёт
TimeOfDay из строки с форматом HH:MM:SS. Пробелы удаляются из заданной строки.
Параметры: S isoExtString |
Строка, отформатированная в расширенном формате ISO для времени.
|
static pure nothrow @property @safe TimeOfDay
min
();
Возвращает полночь.
static pure nothrow @property @safe TimeOfDay
max
();
Возвращает время за одну секунду до полуночи.
Объединяет структуры
Date и
TimeOfDay, чтобы дать объект, который содержит как дату, так и время. Он оптимизирован для календарных операций и не имеет понятия о часовом поясе. В качестве объекта, который оптимизирован для временных операций на основе системного времени, используйте
SysTime.
SysTime содержит концепцию часового пояса и имеет гораздо более высокую точность (hnsecs).
DateTime
главным образом предназначен для использования календарных операций, а не для работы с точным временем.
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
);
-
Возвращает: this < rhs | < 0 |
this == rhs | 0 |
this > rhs | > 0 |
const pure nothrow @property @safe Date
date
();
-
pure nothrow @property @safe void
date
(in Date
date
);
Присвоить часть
DateTime, связанную с датой.
Параметры: Date date |
Дата, присваиваемая дате в этой DateTime.
|
const pure nothrow @property @safe TimeOfDay
timeOfDay
();
-
pure nothrow @property @safe void
timeOfDay
(in TimeOfDay
tod
);
Присвоить часть
DateTime, связанную с временем.
Параметры: TimeOfDay tod |
Время суток, присваиваемое времени в этой DateTime.
|
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);
const pure @property @safe short
yearBC
();
Год григорианского календаря до Нашей Эры, с расчётом, что год 0 является первым годом до н.э.
Примеры: 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. |
Примеры: 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)));
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. |
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.
|
const pure nothrow @property @safe ubyte
hour
();
Количество часов от полуночи.
pure @property @safe void
hour
(int
hour
);
Присвоить количество часов от полуночи.
Параметры: int hour |
Номер часа в сутках, устанавливаемый компоненту hour этой DateTime. |
const pure nothrow @property @safe ubyte
minute
();
Номер минуты в часе.
pure @property @safe void
minute
(int
minute
);
Присвоить номер минуты в часе.
Параметры: int minute |
Номер минуты в часе, устанавливаемый компоненту minute этой DateTime. |
const pure nothrow @property @safe ubyte
second
();
Номер секунды в минуте.
pure @property @safe void
second
(int
second
);
Присвоить номер секунды в минуте.
Параметры: int second |
Номер секунды в минуте, устанавливаемый компоненту 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));
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));
const pure nothrow @safe DateTime
opBinary
(string op)(Duration
duration
)
if (op == "+" || op == "-");
-
Допустимые типы арифметики для
DateTime с использованием этого оператора:
DateTime | + | Duration | --> | DateTime |
DateTime | - | 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.
pure nothrow ref @safe DateTime
opOpAssign
(string op, D)(in D
duration
)
if ((op == "+" || op == "-") && (is(Unqual!D == Duration) || is(Unqual!D == TickDuration)));
-
Допустимые типы арифметики для
DateTime с использованием этого оператора:
DateTime | + | duration | --> | DateTime |
DateTime | - | duration | --> | DateTime |
pure nothrow ref @safe DateTime
opOpAssign
(string op)(TickDuration
td
)
if (op == "+" || op == "-");
-
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 января – тоже один месяц.
Примеры: 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
();
-
const pure nothrow @property @safe ushort
dayOfYear
();
-
Примеры: 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.
|
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
();
-
pure @safe DateTime
fromISOString
(S)(in S
isoString
)
if (isSomeString!S);
Создает
DateTime из строки с форматом YYYYMMDDTHHMMSS. Пробелы удаляются из переданной строки.
Параметры: S isoString |
Строка, отформатированная в формате ISO для даты и времени.
|
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 форматирует даты и время.
|
static pure nothrow @property @safe DateTime
min
();
Возвращает самое раннее из всех возможных значений
DateTime.
static pure nothrow @property @safe DateTime
max
();
Возвращает самое позднее из всех возможных значений
DateTime.
Представляет интервал времени.
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 – доп. пер.
pure this
(U)(in TP
begin
, in U
end
)
if (is(Unqual!TP == Unqual!U));
Параметры: TP begin |
Отметка времени начала интервала.
|
U end |
Отметка времени, в которой интервал заканчивается (но не входит в него).
|
Пример:
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 |
Длительность от начальной отметки до конечной отметки. |
Пример:
assert(Interval!Date(Date(1996, 1, 2), dur!"days"(3)) ==
Interval!Date(Date(1996, 1, 2), Date(1996, 1, 5)));
pure nothrow ref Interval
opAssign
(ref const Interval
rhs
);
Параметры: Interval rhs |
Interval для присвоения этому экземпляру. |
pure nothrow ref Interval
opAssign
(Interval
rhs
);
Параметры: Interval rhs |
Interval для присвоения этому экземпляру. |
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 |
Отметка времени, устанавливаемая в качестве начальной. |
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 |
Отметка времени, устанавливаемая в качестве конечной. |
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 |
Отметка времени, для которой проверяется включение в этот интервал.
|
Пример:
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 |
Интервал, для которого проверяется включение в этот интервал.
|
Пример:
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 |
Интервал, для которого проверяется включение в этот интервал.
|
Пример:
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 |
Интервал, для которого проверяется включение в этот интервал. |
Пример:
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 |
Отметка времени, для которой проверяется, находится ли этот интервал перед ней.
|
Пример:
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 |
Интервал для сравнения с этим интервалом.
|
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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 |
Отметка времени, для которой проверяется, находится ли этот интервал после неё. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAfter(
NegInfInterval!Date(Date(1996, 1, 2))));
const pure bool
intersects
(in Interval
interval
);
Пересекаются ли заданный интервал с этим интервалом.
Параметры: Interval interval |
Интервал, для которого проверяется наличие пересечения с этим интервалом.
|
Пример:
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 |
Интервал, для которого проверяется наличие пересечения с этим интервалом. |
Пример:
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 |
Интервал, для которого проверяется наличие пересечения с этим интервалом. |
Пример:
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
NegInfInterval!Date(Date(1996, 1, 2))));
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersects(
NegInfInterval!Date(Date(2000, 1, 2))));
const Interval
intersection
(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 |
Интервал, пересекающийся с этим интервалом. |
Пример:
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 |
Интервал, пересекающийся с этим интервалом. |
Пример:
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
NegInfInterval!Date(Date(1999, 7, 6))) ==
Interval!Date(Date(1996, 1 , 2), Date(1999, 7, 6)));
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).intersection(
NegInfInterval!Date(Date(2013, 1, 12))) ==
Interval!Date(Date(1996, 1 , 2), Date(2012, 3, 1)));
const pure bool
isAdjacent
(in Interval
interval
);
Примыкает ли заданный интервал к этому интервалу.
Как я понял, имеется ввиду случай, когда начальная отметка времени одного из интервалов равна конечной отметке времени другого интервала – прим. пер.
Параметры: Interval interval |
Интервал, который надо проверить, примыкает ли он к этому интервалу.
|
Пример:
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 |
Интервал, который надо проверить, примыкает ли он к этому интервалу. |
Пример:
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 |
Интервал, который надо проверить, примыкает ли он к этому интервалу. |
Пример:
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
NegInfInterval!Date(Date(1996, 1, 2))));
assert(!Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).isAdjacent(
NegInfInterval!Date(Date(2000, 1, 2))));
const Interval
merge
(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)));
const pure Interval
span
(in Interval
interval
);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов и заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры: Interval interval |
Интервал, создающий span вместе с этим интервалом.
|
Пример:
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 вместе с этим интервалом. |
Пример:
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 вместе с этим интервалом. |
Пример:
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
NegInfInterval!Date(Date(1602, 5, 21))) ==
NegInfInterval!Date(Date(2012, 3 , 1)));
assert(Interval!Date(Date(1996, 1, 2), Date(2012, 3, 1)).span(
NegInfInterval!Date(Date(2013, 1, 12))) ==
NegInfInterval!Date(Date(2013, 1 , 12)));
pure void
shift
(D)(D
duration
)
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)));
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 при создании диапазона.
|
Предупреждение:
Функция 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);
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 при создании диапазона.
|
Предупреждение:
Функция 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);
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
();
Преобразует этот интервал в строку.
struct
PosInfInterval
(TP);
Представляет интервал времени, у которого концом является положительная бесконечность.
Любые диапазоны, которые итерируют по PosInfInterval
, являются бесконечными. Таким образом, основная цель использования PosInfInterval
– создание бесконечного диапазона, который начинается в фиксированный момент времени и переходит в положительную бесконечность.
pure nothrow this(in TP
begin
);
Параметры: TP begin |
Отметка времени начала интервала. |
Пример:
auto interval = PosInfInterval!Date(Date(1996, 1, 2));
pure nothrow ref PosInfInterval
opAssign
(ref const PosInfInterval
rhs
);
Параметры: PosInfInterval rhs |
PosInfInterval для присвоения этому экземпляру. |
pure nothrow ref PosInfInterval
opAssign
(PosInfInterval
rhs
);
Параметры: PosInfInterval rhs |
PosInfInterval для присвоения этому экземпляру. |
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 |
Отметка времени, задающая начало интервала. |
Равна ли длина интервала 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 |
Интервал, для которого проверяется включение в этот интервал. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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))));
const pure bool
intersects
(in Interval!TP
interval
);
Пересекаются ли заданный интервал с этим интервалом.
Параметры: Interval!TP interval |
Интервал, для которого проверяется наличие пересечения с этим интервалом. |
Пример:
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))));
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 |
Интервал, пересекающийся с этим интервалом. |
Пример:
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
NegInfInterval!Date(Date(1999, 7, 6))) ==
Interval!Date(Date(1996, 1 , 2), Date(1999, 7, 6)));
assert(PosInfInterval!Date(Date(1996, 1, 2)).intersection(
NegInfInterval!Date(Date(2013, 1, 12))) ==
Interval!Date(Date(1996, 1 , 2), Date(2013, 1, 12)));
const pure bool
isAdjacent
(in Interval!TP
interval
);
Примыкает ли заданный интервал к этому интервалу.
Параметры: Interval!TP interval |
Интервал, который надо проверить, примыкает ли он к этому интервалу. |
Пример:
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))));
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)));
const pure PosInfInterval
span
(in Interval!TP
interval
);
Возвращает интервал, который начинается с самой ранней отметки времени из двух интервалов.
Параметры: Interval!TP interval |
Интервал, создающий span вместе с этим интервалом.
|
Замечание:
Не существует перегрузки для 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)));
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, что может привести к увеличению месяца.
|
Пример:
auto interval1 = PosInfInterval!Date(Date(1996, 1, 2));
auto interval2 = PosInfInterval!Date(Date(1996, 1, 2));
interval1.shift(dur!"days"(50));
assert(interval1 == PosInfInterval!Date(Date(1996, 2, 21)));
interval2.shift(dur!"days"(-50));
assert(interval2 == PosInfInterval!Date(Date(1995, 11, 13)));
pure nothrow void
expand
(D)(D
duration
)
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, что может привести к увеличению месяца.
|
Пример:
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 при создании диапазона. |
Предупреждение:
Функция 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);
assert(range.front == Date(2010, 9, 1));
range.popFront();
assert(range.front == Date(2010, 9, 2));
range.popFront();
assert(range.front == Date(2010, 9, 4));
range.popFront();
assert(range.front == Date(2010, 9, 6));
range.popFront();
assert(range.front == Date(2010, 9, 8));
range.popFront();
assert(!range.empty);
const nothrow string
toString
();
Преобразует этот интервал в строку.
struct
NegInfInterval
(TP);
Представляет интервал времени, начинающийся с отрицательной бесконечности.
Любые диапазоны, которые итерируют по NegInfInterval
, являются бесконечными. Таким образом, основная цель использования NegInfInterval
– создать бесконечный диапазон, который начинается с отрицательной бесконечности и заканчивается в фиксированном моменте времени. Итерации над ним ведутся в обратном порядке.
pure nothrow this(in TP
end
);
Параметры: TP end |
Отметка времени, в которой интервал заканчивается. |
Пример:
auto interval = PosInfInterval!Date(Date(1996, 1, 2));
pure nothrow ref NegInfInterval
opAssign
(ref const NegInfInterval
rhs
);
Параметры: NegInfInterval rhs |
NegInfInterval для присвоения этому экземпляру. |
pure nothrow ref NegInfInterval
opAssign
(NegInfInterval
rhs
);
Параметры: NegInfInterval rhs |
NegInfInterval для присвоения этому экземпляру. |
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 |
Отметка времени, задающая конец интервала.
|
Равна ли длина интервала 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 |
Интервал, для которого проверяется включение в этот интервал. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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 |
Интервал для сравнения с этим интервалом. |
Пример:
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))));
const pure bool
intersects
(in Interval!TP
interval
);
Пересекаются ли заданный интервал с этим интервалом.
Параметры: Interval!TP interval |
Интервал, для которого проверяется наличие пересечения с этим интервалом. |
Пример:
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))));
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 |
Интервал, пересекающийся с этим интервалом. |
Пример:
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)));
const pure bool
isAdjacent
(in Interval!TP
interval
);
Примыкает ли заданный интервал к этому интервалу.
Параметры: Interval!TP interval |
Интервал, который надо проверить, примыкает ли он к этому интервалу. |
Пример:
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))));
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)));
const pure NegInfInterval
span
(in Interval!TP
interval
);
Возвращает интервал, который заканчивается на самой поздней отметке времени из двух интервалов (но не включая её).
Параметры: Interval!TP interval |
Интервал, создающий span вместе с этим интервалом.
|
Замечание:
Не существует перегрузки для 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)));
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, что может привести к увеличению месяца.
|
Пример:
auto interval1 = NegInfInterval!Date(Date(2012, 3, 1));
auto interval2 = NegInfInterval!Date(Date(2012, 3, 1));
interval1.shift(2);
assert(interval1 == NegInfInterval!Date(Date(2014, 3, 1)));
interval2.shift(-2);
assert(interval2 == NegInfInterval!Date(Date(2010, 3, 1)));
pure nothrow void
expand
(D)(D
duration
)
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, что может привести к увеличению месяца.
|
Пример:
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 при создании диапазона.
|
Предупреждение:
Функция 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));
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 |
Месяц, в котором каждый раз будет находиться отметка времени диапазона.
|
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 |
Длительность для прибавления к моменту времени, передаваемому в делегат.
|
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
();
Первая отметка времени в диапазоне.
Выталкивает 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
();
Направление, в котором этот диапазон итерирует.
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, присваеваемый этому экземпляру. |
Это бесконечный диапазон, поэтому он никогда не бывает пустым.
const pure nothrow @property TP
front
();
Первая отметка времени в диапазоне.
Выталкивает front из диапазона, используя функцию func для генерации следующей отметки времени в диапазоне.
pure nothrow @property PosInfIntervalRange
save
();
Возвращает копию this.
const pure nothrow @property PosInfInterval!TP
interval
();
Интервал, по которому проходит этот диапазон.
pure nothrow @property TP delegate(in TP)
func
();
Функция, используемая для генерации следующей отметки времени в диапазоне.
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 для присвоения этому экземпляру. |
Это бесконечный диапазон, поэтому он никогда не бывает пустым.
const pure nothrow @property TP
front
();
Первая отметка времени в диапазоне.
Выталкивает front из диапазона, используя функцию func для генерации следующей отметки времени в диапазоне.
pure nothrow @property NegInfIntervalRange
save
();
Возвращает копию this.
const pure nothrow @property NegInfInterval!TP
interval
();
Интервал, по которому проходит этот диапазон.
pure nothrow @property TP delegate(in TP)
func
();
Функция, используемая для генерации следующей отметки времени в диапазоне.
Представляет часовой пояс. Он используется со структурой
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 |
Название нужного часового пояса в базе данных часовых поясов
|
Примеры: 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, если не получается прочитать реестр.
class
LocalTime
:
std.datetime.TimeZone;
TimeZone, который представляет текущий локальный часовой пояс в системе, на которой запущена ваша программа.
Использует базовые C-вызовы для настройки времени, вместо использования D-специфичного кода, основанного на системных настройках, для вычисления времени, такого как
PosixTimeZone и
WindowsTimeZone. Это также означает, что будет использоваться текущий часовой пояс в системе, даже если часовой пояс системы изменяется во время работы программы.
static pure nothrow @trusted immutable(LocalTime)
opCall
();
-
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-время. |
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
);
-
Параметры: long stdTime |
UTC-время для получения величины смещения от UTC для этого часового пояса. |
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
);
-
Параметры: 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, положительное – к востоку).
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, если он не читается с диска.
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. |
Пример:
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.
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);
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 для преобразования. |
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(); 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;
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
();
Старт секундомера.
Остановка секундомера.
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]); auto f1Result = to!Duration(r[1]); auto f2Result = to!Duration(r[2]);
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)();
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
Примеры: 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
Примеры: assert(stdTimeToUnixTime(621_355_968_000_000_000L) == 0);
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).
|
@safe FILETIME
stdTimeToFILETIME
(long
stdTime
);
Эта функция только для Windows.
Преобразует число hnsec, прошедших от полуночи, 1 января, 1 года нашей эры в структуру FILETIME.
Параметры: long stdTime |
количество hnsec, прошедших от полуночи, 1 января, 1 года нашей эры UTC. |
@safe FILETIME
SysTimeToFILETIME
(SysTime
sysTime
);
Эта функция только для Windows.
Преобразует
SysTime в структуру
FILETIME.
FILETIME всегда находится в UTC.
Параметры: SysTime sysTime |
Значение SysTime для преобразования. |
alias
DosFileTime
= uint;
Тип, представляющий формат даты/времени файла DOS.
@safe SysTime
DosFileTimeToSysTime
(DosFileTime
dft
, immutable TimeZone
tz
= LocalTime());
Преобразует из даты/времени файла DOS в
SysTime.
Параметры: DosFileTime dft |
Время DOS-файла для преобразования. |
TimeZone tz |
Часовой пояс, в котором, как предполагается, находится время файла DOS.
|
@safe DosFileTime
SysTimeToDosFileTime
(SysTime
sysTime
);
Преобразует из
SysTime в дату/время файла DOS.
Параметры: SysTime sysTime |
SysTime для преобразования. |
@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 |
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 |
Проверяемый день. |
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 в списке исключений. |
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 в списке исключений. |
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();
}
}