Этот модуль предоставляет:
- Типы для представления отметок во времени: 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.
Represents a time zone from the Windows registry. Unfortunately, Windows
does not use the TZ Database. To use the TZ Database, use
PosixTimeZone (which reads its information from the TZ Database
files on disk) on Windows by providing the TZ Database files and telling
PosixTimeZone.getTimeZone where the directory holding them is.
The TZ Database files and Windows' time zone information frequently
do not match. Windows has many errors with regards to when DST switches
occur (especially for historical dates). Also, the TZ Database files
include far more time zones than Windows does. So, for accurate
time zone information, use the TZ Database files with
PosixTimeZone rather than
WindowsTimeZone
. However, because
WindowsTimeZone
uses Windows system calls to deal with the time,
it's far more likely to match the behavior of other Windows programs.
Be aware of the differences when selecting a method.
WindowsTimeZone
does not exist on Posix systems.
To get a
WindowsTimeZone
, either call
WindowsTimeZone
.getTimeZone or call
TimeZone.getTimeZone
(which will give a
PosixTimeZone on Posix systems and a
WindowsTimeZone
on Windows systems).
const nothrow @property @safe bool
hasDST
();
Whether this time zone has Daylight Savings Time at any point in
time. Note that for some time zone types it may not have DST for
current dates but will still return true
for hasDST
because the
time zone did at some point have DST.
const nothrow @safe bool
dstInEffect
(long
stdTime
);
Takes the number of hnsecs (100 ns) since midnight, January 1st,
1 A.D. in UTC time (i.e. std time) and returns whether DST is in
effect in this time zone at the given point in time.
Параметры: long stdTime |
The UTC time that needs to be checked for DST in this
time zone. |
const nothrow @safe long
utcToTZ
(long
stdTime
);
Takes the number of hnsecs (100 ns) since midnight, January 1st,
1 A.D. in UTC time (i.e. std time) and converts it to this time
zone's time.
Параметры: long stdTime |
The UTC time that needs to be adjusted to this time
zone's time. |
const nothrow @safe long
tzToUTC
(long
adjTime
);
Takes the number of hnsecs (100 ns) since midnight, January 1st,
1 A.D. in this time zone's time and converts it to UTC (i.e. std
time).
Параметры: long adjTime |
The time in this time zone that needs to be adjusted
to UTC time. |
static @safe immutable(WindowsTimeZone)
getTimeZone
(string
name
);
Returns a
TimeZone with the given
name
per the Windows time
zone names. The time zone information is fetched from the Windows
registry.
Параметры: string name |
The TZ Database name of the desired time zone. |
Пример:
auto tz = WindowsTimeZone.getTimeZone("Pacific Standard Time");
static @safe string[]
getInstalledTZNames
();
Returns a list of the names of the time zones installed on the
system. The list returned by WindowsTimeZone contains the Windows
TZ names, not the TZ Database names. However,
TimeZone.getinstalledTZNames will return the TZ Database names
which are equivalent to the Windows TZ names.
nothrow @safe void
setTZEnvVar
(string
tzDatabaseName
);
This function is Posix-Only.
Sets the local time zone on Posix systems with the TZ
Database name by setting the TZ environment variable.
Unfortunately, there is no way to do it on Windows using the TZ
Database name, so this function only exists on Posix systems.
nothrow @safe void
clearTZEnvVar
();
This function is Posix-Only.
Clears the TZ environment variable.
struct
TZConversions
;
pure @safe TZConversions
parseTZConversions
(string
windowsZonesXMLText
);
Provides the conversions between the IANA time zone database time zone names
(which POSIX systems use) and the time zone names that Windows uses.
Windows uses a different set of time zone names than the IANA time zone
database does, and how they correspond to one another changes over time
(particularly when Microsoft updates Windows).
windowsZones.xml
provides the current conversions (which may or may not match up with what's
on a particular Windows box depending on how up-to-date it is), and
parseTZConversions
reads in those conversions from windowsZones.xml so that
a D program can use those conversions.
However, it should be noted that the time zone information on Windows is
frequently less accurate than that in the IANA time zone database, and if
someone really wants accurate time zone information, they should use the
IANA time zone database files with
PosixTimeZone on Windows rather
than
WindowsTimeZone, whereas
WindowsTimeZone makes more
sense when trying to match what Windows will think the time is in a specific
time zone.
Also, the IANA time zone database has a lot more time zones than Windows
does.
Исключения: Exception if there is an error while parsing the given 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));
string[][string]
toWindows
;
The key is the Windows time zone name, and the value is a list of
IANA TZ database names which are close (currently only ever one, but
it allows for multiple in case it's ever necessary).
string[][string]
fromWindows
;
The key is the IANA time zone database name, and the value is a list of
Windows time zone names which are close (usually only one, but it could
be multiple).
deprecated pure nothrow @nogc @safe string
tzDatabaseNameToWindowsTZName
(string
tzName
);
Deprecated. Use parseTZConversions instead. Microsoft changes
their time zones too often for us to compile the conversions into
Phobos and have them be properly up-to-date.
tzDatabaseNameToWindowsTZName
will be removed in July 2017.
Converts the given TZ Database name to the corresponding Windows time zone
name.
Note that in a few cases, a TZ Dabatase name corresponds to two different
Windows time zone names. So, while in most cases converting from one to the
other and back again will result in the same time zone name started
with, in a few case, it'll get a different name.
Also, there are far more TZ Database names than Windows time zones, so some
of the more exotic TZ Database names don't have corresponding Windows time
zone names.
Returns
null
if the given time zone name cannot be converted.
Параметры: string tzName |
The TZ Database name to convert. |
deprecated pure nothrow @nogc @safe string
windowsTZNameToTZDatabaseName
(string
tzName
);
Deprecated. Use parseTZConversions instead. Microsoft changes
their time zones too often for us to compile the conversions into
Phobos and have them be properly up-to-date.
windowsTZNameToTZDatabaseName
will be removed in July 2017.
Converts the given Windows time zone name to a corresponding TZ Database
name.
Returns
null
if the given time zone name cannot be converted.
Параметры: string tzName |
The TZ Database name to convert. |
StopWatch
measures time as precisely as possible.
This class uses a high-performance counter. On Windows systems, it uses
QueryPerformanceCounter, and on Posix systems, it uses
clock_gettime if available, and
gettimeofday otherwise.
But the precision of
StopWatch
differs from system to system. It is
impossible to for it to be the same from system to system since the precision
of the system clock varies from system to system, and other system-dependent
and situation-dependent stuff (such as the overhead of a context switch
between threads) can also affect
StopWatch
's accuracy.
Примеры: 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
);
Auto start with constructor.
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
();
Resets the stop watch.
Примеры: StopWatch sw;
sw.start();
sw.stop();
sw.reset();
assert(sw.peek().to!("seconds", real)() == 0);
@nogc @safe void
start
();
Starts the stop watch.
Stops the stop
watch.
const @nogc @safe TickDuration
peek
();
Peek at the amount of time which has passed since the stop watch was
started.
@nogc @safe void
setMeasured
(TickDuration
d
);
Set the amount of time which has been measured since the stop watch was
started.
const pure nothrow @nogc @property @safe bool
running
();
Confirm whether this stopwatch is measuring time.
TickDuration[fun.length]
benchmark
(fun...)(uint
n
);
Benchmarks code for speed assessment and comparison.
Параметры: fun |
aliases of callable objects (e.g. function names). Each should
take no arguments. |
uint n |
The number of times each function is to be executed. |
Возвращает: The amount of time (as a
core.time.TickDuration) that it took to
call each function
n
times. The first value is the length of time
that it took to call
fun[0] n
times. The second value is the
length of time it took to call
fun[1] n
times. Etc.
Note that casting the TickDurations to
core.time.Durations will make
the results easier to deal with (and it may change in the future that
benchmark
will return an array of Durations rather than TickDurations).
Примеры: 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
;
Return value of benchmark with two functions comparing.
const pure nothrow @property @safe real
point
();
Evaluation value
This returns the evaluation value of performance as the ratio of
baseFunc's time over targetFunc's time. If performance is high, this
returns a high value.
const pure nothrow @property @safe TickDuration
baseTime
();
The time required of the base function
const pure nothrow @property @safe TickDuration
targetTime
();
The time required of the target function
ComparingBenchmarkResult
comparingBenchmark
(alias baseFunc, alias targetFunc, int times = 4095)();
Benchmark with two functions comparing.
Параметры: baseFunc |
The function to become the base of the speed. |
targetFunc |
The function that wants to measure speed. |
times |
The number of times each function is to be executed. |
Примеры: void f1x() {}
void f2x() {}
@safe void f1o() {}
@safe void f2o() {}
auto b1 = comparingBenchmark!(f1o, f2o, 1)();
enum auto
isTimePoint
(T);
Whether the given type defines all of the necessary functions for it to
function as a time point.
1.
T must define a static property named
min which is the smallest
value of
T as .
2.
T must define a static property named
max which is the largest
value of
T as .
3.
T must define an
opBinary for addition and subtraction that
accepts
core.time.Duration and returns
Unqual!T.
4.
T must define an
opOpAssign for addition and subtraction that
accepts
core.time.Duration and returns
ref Unqual!T.
5.
T must define a
opBinary for subtraction which accepts
T
and returns returns
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
);
Whether the given Gregorian Year is a leap year
.
Параметры: int year |
The year to to be tested. |
pure nothrow @safe long
unixTimeToStdTime
(long
unixTime
);
Converts from unix time (which uses midnight, January 1st, 1970 UTC as its
epoch and seconds as its units) to "std time" (which uses midnight,
January 1st, 1 A.D. UTC and hnsecs as its units).
The C standard does not specify the representation of time_t, so it is
implementation defined. On POSIX systems, unix time is equivalent to
time_t, but that's not necessarily
true
on other systems (e.g. it is
not
true
for the Digital Mars C runtime). So, be careful when using unix
time with C functions on non-POSIX systems.
"std time"'s epoch is based on the Proleptic Gregorian Calendar per ISO
8601 and is what
SysTime uses internally. However, holding the time
as an integer in hnescs since that epoch technically isn't actually part of
the standard, much as it's based on it, so the name "std time" isn't
particularly good, but there isn't an official name for it. C# uses "ticks"
for the same thing, but they aren't actually clock ticks, and the term
"ticks"
is used for actual clock ticks for
core.time.MonoTime, so
it didn't make sense to use the term ticks here. So, for better or worse,
std.datetime uses the term "std time" for this.
Параметры: long unixTime |
The unix time to convert. |
Смотрите также: 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));
Converts std time (which uses midnight, January 1st, 1 A.D. UTC as its epoch
and hnsecs as its units) to unix time (which uses midnight, January 1st,
1970 UTC as its epoch and seconds as its units).
The C standard does not specify the representation of time_t, so it is
implementation defined. On POSIX systems, unix time is equivalent to
time_t, but that's not necessarily
true
on other systems (e.g. it is
not
true
for the Digital Mars C runtime). So, be careful when using unix
time with C functions on non-POSIX systems.
"std time"'s epoch is based on the Proleptic Gregorian Calendar per ISO
8601 and is what
SysTime uses internally. However, holding the time
as an integer in hnescs since that epoch technically isn't actually part of
the standard, much as it's based on it, so the name "std time" isn't
particularly good, but there isn't an official name for it. C# uses "ticks"
for the same thing, but they aren't actually clock ticks, and the term
"ticks"
is used for actual clock ticks for
core.time.MonoTime, so
it didn't make sense to use the term ticks here. So, for better or worse,
std.datetime uses the term "std time" for this.
By default, the return type is time_t (which is normally an alias for
int on 32-bit systems and long on 64-bit systems), but if a different
size is required than either int or long can be passed as a template
argument to get the desired size.
If the return type is int, and the result can't fit in an int, then the
closest value that can be held in 32 bits will be used (so
int.max
if it goes over and
int.min if it goes under). However, no attempt
is made to deal with integer overflow if the return type is long.
Параметры: T |
The return type (int or long). It defaults to time_t, which is
normally 32 bits on a 32-bit system and 64 bits on a 64-bit
system. |
long stdTime |
The std time to convert. |
Возвращает: A signed integer representing the unix time which is equivalent to
the given 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());
This function is Windows-Only.
Converts a
SYSTEMTIME struct to a
SysTime.
Параметры: SYSTEMTIME* st |
The SYSTEMTIME struct to convert. |
TimeZone tz |
The time zone that the time in the SYSTEMTIME struct is
assumed to be (if the SYSTEMTIME was supplied by a Windows
system call, the SYSTEMTIME will either be in local time
or UTC, depending on the call). |
Исключения: DateTimeException if the given
SYSTEMTIME will not fit in
a
SysTime, which is highly unlikely to happen given that
SysTime.max is in 29,228 A.D. and the maximum
SYSTEMTIME
is in 30,827 A.D.
@safe SYSTEMTIME
SysTimeToSYSTEMTIME
(in SysTime
sysTime
);
This function is Windows-Only.
Converts a
SysTime to a
SYSTEMTIME struct.
The
SYSTEMTIME which is returned will be set using the given
SysTime's time zone, so to get the
SYSTEMTIME in
UTC, set the
SysTime's time zone to UTC.
Параметры: SysTime sysTime |
The SysTime to convert. |
@safe long
FILETIMEToStdTime
(const FILETIME*
ft
);
This function is Windows-Only.
Converts a FILETIME struct to the number of hnsecs since midnight,
January 1st, 1 A.D.
Параметры: FILETIME* ft |
The FILETIME struct to convert. |
@safe SysTime
FILETIMEToSysTime
(const FILETIME*
ft
, immutable TimeZone
tz
= LocalTime());
This function is Windows-Only.
Converts a
FILETIME struct to a
SysTime.
Параметры: FILETIME* ft |
The FILETIME struct to convert. |
TimeZone tz |
The time zone that the SysTime will be in (FILETIMEs
are in UTC). |
@safe FILETIME
stdTimeToFILETIME
(long
stdTime
);
This function is Windows-Only.
Converts a number of hnsecs since midnight, January 1st, 1 A.D. to a
FILETIME struct.
Параметры: long stdTime |
The number of hnsecs since midnight, January 1st, 1 A.D. UTC. |
@safe FILETIME
SysTimeToFILETIME
(SysTime
sysTime
);
This function is Windows-Only.
Converts a
SysTime to a
FILETIME struct.
FILETIMEs are always in UTC.
Параметры: SysTime sysTime |
The SysTime to convert. |
alias
DosFileTime
= uint;
Type representing the DOS file date/time format.
@safe SysTime
DosFileTimeToSysTime
(DosFileTime
dft
, immutable TimeZone
tz
= LocalTime());
Converts from DOS file date/time to
SysTime.
Параметры: DosFileTime dft |
The DOS file time to convert. |
TimeZone tz |
The time zone which the DOS file time is assumed to be in. |
@safe DosFileTime
SysTimeToDosFileTime
(SysTime
sysTime
);
Converts from
SysTime to DOS file date/time.
Параметры: SysTime sysTime |
The SysTime to convert. |
@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)));
The given array of
char or random-access range of
char or
ubyte is expected to be in the format specified in
RFC 5322 section 3.3 with the
grammar rule
date-time. It is the date-time format commonly used in
internet messages such as e-mail and HTTP. The corresponding
SysTime will be returned.
RFC 822 was the original spec (hence the function's name), whereas RFC 5322
is the current spec.
The day of the week is ignored beyond verifying that it's a valid day of the
week, as the day of the week can be inferred from the date. It is not
checked whether the given day of the week matches the actual day of the week
of the given date (though it is technically invalid per the spec if the
day of the week doesn't match the actual day of the week of the given date).
If the time zone is
"-0000" (or considered to be equivalent to
"-0000" by section 4.3 of the spec), a
SimpleTimeZone with a
utc offset of
0 is used rather than
UTC, whereas
"+0000"
uses
UTC.
Note that because
SysTime does not currently support having a second
value
of 60 (as is sometimes done for leap seconds), if the date-time
value
does have a
value
of 60 for the seconds, it is treated as 59.
The one area in which this function violates RFC 5322 is that it accepts
"\n" in folding whitespace in the place of
"\r\n", because the
HTTP spec requires it.
Исключения: DateTimeException if the given string doesn't follow the grammar
for a date-time field or if the resulting
SysTime is invalid.
Примеры: 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
...);
Whether all of the given strings are valid units
of time.
"nsecs" is not considered a valid unit of time. Nothing in std.datetime
can handle precision greater than hnsecs, and the few functions in core.time
which deal with "nsecs" deal with it explicitly.
pure @safe int
cmpTimeUnits
(string
lhs
, string
rhs
);
Compares two time unit strings. "years" are the largest units and
"hnsecs" are the smallest.
Возвращает: this < rhs | < 0 |
this == rhs | 0 |
this > rhs | > 0 |
template
CmpTimeUnits
(string lhs, string rhs) if (validTimeUnits(lhs, rhs))
Compares two time unit strings at compile time. "years" are the largest
units and "hnsecs" are the smallest.
This template is used instead of cmpTimeUnits because exceptions
can't be thrown at compile time and cmpTimeUnits must enforce that
the strings it's given are valid time unit strings. This template uses a
template constraint instead.
Возвращает: 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");
Returns whether the given value
is valid
for the given unit type when in a
time point. Naturally, a duration is not held to a particular range, but
the values in a time point are (e.g. a month must be in the range of
1 - 12 inclusive).
Параметры: units |
The units of time to validate. |
int value |
The number to validate. |
Примеры: 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");
Returns whether the given day
is valid
for the given year
and month
.
Параметры: units |
The units of time to validate. |
int year |
The year of the day to validate. |
int month |
The month of the day to validate. |
int day |
The day to validate. |
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 |
The units of time to validate. |
int value |
The number to validate. |
string file |
The file that the DateTimeException will list if thrown. |
size_t line |
The line number that the DateTimeException will list if
thrown. |
pure @safe void
enforceValid
(string units)(int
year
, Month
month
, int
day
, string
file
= __FILE__, size_t
line
= __LINE__)
if (units == "days");
Параметры: units |
The units of time to validate. |
int year |
The year of the day to validate. |
Month month |
The month of the day to validate. |
int day |
The day to validate. |
string file |
The file that the DateTimeException will list if thrown. |
size_t line |
The line number that the DateTimeException will list if
thrown. |
static pure @safe int
monthsToMonth
(int
currMonth
, int
month
);
Returns the number of months from the current months of the year to the
given month
of the year. If they are the same, then the result is 0.
Параметры: int currMonth |
The current month of the year. |
int month |
The month of the year to get the number of months to. |
static pure nothrow @safe int
daysToDayOfWeek
(DayOfWeek
currDoW
, DayOfWeek
dow
);
Returns the number of days from the current day of the week to the given
day of the week. If they are the same, then the result is 0.
Параметры: DayOfWeek currDoW |
The current day of the week. |
DayOfWeek dow |
The day of the week to get the number of days to. |
auto
measureTime
(alias func)();
Function for starting to a stop watch time when the function is called
and stopping it when its return value goes out of scope and is destroyed.
When the value that is returned by this function is destroyed,
func will run.
func is a unary function that takes a
core.time.TickDuration.
Пример:
{
auto mt = measureTime!((TickDuration a)
{ });
}
which is functionally equivalent to
{
auto sw = StopWatch(Yes.autoStart);
scope(exit)
{
TickDuration a = sw.peek();
}
}