clock
-
НАЗВАНИЕ
- clock — Получение и изменение дат и времени
- СИНТАКСИС
- ОПИСАНИЕ
-
clock add timeVal ?count unit...? ?-option value?
- clock clicks ?-option?
- clock format timeVal ?-option value...?
- clock microseconds
- clock milliseconds
- clock scan inputString ?-option value...?
- clock seconds
- clock clicks ?-option?
-
count
- timeVal
- unit
- timeVal
-
%a
- %A
- %b
- %B
- %c
- %C
- %d
- %D
- %e
- %Ec
- %EC
- %EE
- %Ex
- %EX
- %Ey
- %EY
- %g
- %G
- %h
- %H
- %I
- %j
- %J
- %k
- %l
- %m
- %M
- %N
- %Od, %Oe, %OH, %OI, %Ok, %Ol, %Om, %OM, %OS, %Ou, %Ow, %Oy
- %p
- %P
- %Q
- %r
- %R
- %s
- %S
- %t
- %T
- %u
- %U
- %V
- %w
- %W
- %x
- %X
- %y
- %Y
- %z
- %Z
- %%
- %+
- %A
-
time
- date
- ISO 8601 момент времени
- относительное время
- date
Имя
clock — Получение и изменение дат и времениСинтаксис
package require Tcl 8.5clock addtimeVal ?count unit...? ?-option value?
clock clicks ?-option?
clock formattimeVal ?-option value...?
clock microseconds
clock milliseconds
clock scaninputString ?-option value...?
clock seconds
Описание
Команда clock выполняет несколько операций, которые получают и изменяют значения, представляющие время. Команда поддерживает несколько подкоманд, определяющих действие, выполняемое командой.- clock add timeVal ?count unit...? ?-option value?
- Добавляет (возможно, отрицательное) смещение к времени, выраженному как целое число секунд. Полное описание см. в разделе АРИФМЕТИКА ВРЕМЕНИ.
- clock clicks ?-option?
- Если аргумент -option не указан, возвращает значение времени с высоким разрешением в виде зависящего от системы целого значения. Единица значения зависит от системы, но должна соответствовать самому высокому разрешению имеющегося на системе таймера, например, счётчику циклов процессора. Полное описание см. в разделе ТАЙМЕРЫ С ВЫСОКИМ РАЗРЕШЕНИЕМ.
Если аргумент -option равен -milliseconds, то команда эквивалентна команде clock milliseconds (см. ниже). Это использование устарело, и clock milliseconds следует рассматривать как предпочтительный способ получения отсчёта миллисекунд.
Если аргумент -option равен -microseconds, то команда эквивалентна команде clock microseconds (см. ниже). Это использование устарело, и clock microseconds следует рассматривать как предпочтительный способ получения отсчёта микросекунд.
- clock format timeVal ?-option value...?
- Форматирует время, выраженное целым числом секунд, в формат, предназначенный для использования пользователями или внешними программами. Полное описание см. в разделе ФОРМАТИРОВАНИЕ ВРЕМЕНИ.
- clock microseconds
- Возвращает текущее время в виде целого числа микросекунд. Полное описание см. в разделе ТАЙМЕРЫ С ВЫСОКИМ РАЗРЕШЕНИЕМ.
- clock milliseconds
- Возвращает текущее время в виде целого числа миллисекунд. Полное описание см. в разделе ТАЙМЕРЫ С ВЫСОКИМ РАЗРЕШЕНИЕМ.
- clock scan inputString ?-option value...?
- Сканирует время, выраженное строкой символов, и возвращает целое число секунд. Полное описание см. в разделе СКАНИРОВАНИЕ ВРЕМЕНИ.
- clock seconds
- Возвращает текущее время в виде целого числа секунд.
Параметры
- count
- Целое число, представляющее количество единиц времени. Подробности см. в разделе АРИФМЕТИКА ВРЕМЕНИ.
- timeVal
- Целое значение, переданное команде clock, представляющее абсолютное время как число секунд с начала эпохи 1 января 1970 года 00:00 UTC. Обратите внимание, что счёт секунд не включает високосные секунды; секунды считаются так, как будто каждый день UTC имеет ровно 86400 секунд. Tcl обрабатывает високосные секунды, ускоряя или замедляя свой таймер на очень небольшую долю в течение нескольких минут, пока не синхронизируется с UTC; его модель данных не представляет минуты, которые имеют 59 или 61 секунду.
- unit
- Одно из слов: секунды, минуты, часы, дни, недели, месяцы или годы, или любое уникальное начальное слово из таких слов. Используется совместно с count для определения интервала времени, например, 3 секунды или 1 год.
Настройки
Если ни одна из этих переменных не задана, используются функции C localtime и mktime для преобразования времени между местным и гринвичским. В 32-разрядных системах этот подход, вероятно, содержит ошибки, особенно для времен, выходящих за рамки интервала (приблизительно с 1902 по 2037 год), который может быть представлен целым числом в 32 бита.
Арифметика часов
Команда clock add выполняет арифметические операции с часами над значением (выраженным в номинальных секундах с эпохи 1 января 1970 года, 00:00 UTC), заданным в качестве первого аргумента. Остальные аргументы (кроме возможных опций -timezone, -locale и -gmt) — целые числа и ключевые слова поочерёдно, где ключевые слова выбираются из секунд, минут, часов, дней, недель, месяцев или лет, или любых уникальных префиксов таких слов.Сложение секунд, минут и часов достаточно простое; указанный приращение времени (умноженное на шестьдесят для минут или 3600 для часов) просто добавляется к timeVal, заданному команде clock add. Результат интерпретируется как номинальное количество секунд с эпохи.
В результате пересечения точки, в которой вставляется или удаляется високосная секунда, могут получиться неожиданные результаты; команда clock add просто игнорирует високосные секунды и, следовательно, предполагает, что время идёт последовательно: 23:59:58, 23:59:59, 00:00:00. (Это предположение обрабатывается тем, что модель времени Tcl реагирует на високосные секунды, ускоряя или замедляя часы на очень малую величину, пока время Tcl не синхронизируется с мировым временем.
Тот факт, что добавление и вычитание часов определяется в терминах абсолютного времени, означает, что это будет добавлять фиксированные интервалы времени в часовых поясах, которые соблюдают летнее время (день световой экономии). Например, следующий код устанавливает значение x в 04:00:00, потому что часы изменились в указанном интервале.
set s [clock scan {2004-10-30 05:00:00} \
-format {%Y-%m-%d %H:%M:%S} \
-timezone :America/New_York]
set a [clock add $s 24 hours -timezone :America/New_York]
set x [clock format $a \
-format {%H:%M:%S} -timezone :America/New_York] Добавление и вычитание дней и недель выполняется путем преобразования заданного времени в календарный день и время суток в соответствующем часовом поясе и локали. Необходимое количество дней (недели переводятся в дни, умножаются на семь) добавляется к календарному дню, а затем дата и время преобразуются обратно в количество секунд с эпохи.
Добавление или вычитание заданного количества дней через точку перехода времени при начале или конце летнего времени (перехода на летнее время) приводит к тому же местному времени в соответствующий день. Например, следующий код устанавливает значение x в 05:00:00.
set s [clock scan {2004-10-30 05:00:00} \
-format {%Y-%m-%d %H:%M:%S} \
-timezone :America/New_York]
set a [clock add $s 1 day -timezone :America/New_York]
set x [clock format $a \
-format {%H:%M:%S} -timezone :America/New_York] В случае неоднозначности, когда одно и то же местное время происходит дважды в один день, используется более раннее время. В случаях, когда преобразование приводит к невозможному времени (например, 02:30 во время весеннего перехода на летнее время с использованием правил США), время преобразуется так, как будто часы не менялись.
set s [clock scan {2004-04-03 02:30:00} \
-format {%Y-%m-%d %H:%M:%S} \
-timezone :America/New_York]
set a [clock add $s 1 day -timezone :America/New_York]
set x [clock format $a \
-format {%H:%M:%S} -timezone :America/New_York] Добавление заданного количества дней или недель работает правильно при переходе между юлианским и григорианским календарями; пропущенные дни пропускаются. Следующий код устанавливает z в 1752-09-14.
set x [clock scan 1752-09-02 -format %Y-%m-%d -locale en_US] set y [clock add $x 1 day -locale en_US] set z [clock format $y -format %Y-%m-%d -locale en_US]
В странном случае, когда добавление заданного количества дней приводит к дате, которая не существует, потому что она попадает в пропущенные дни при переходе от юлианского к григорианскому календарю, дата преобразуется так, как будто она была по юлианскому календарю.
Добавление количества месяцев или лет аналогично; оно преобразует заданное время в календарную дату и время суток. Затем добавляется необходимое количество месяцев или лет, и полученная дата и время суток преобразуются в абсолютное время.
Если полученная дата невозможна, потому что в месяце недостаточно дней (например, при добавлении 1 месяца к 31 января), используется последний день месяца. Таким образом, добавление 1 месяца к 31 января в обычный год приведет к 28 февраля, а в високосном году — к 29 февраля.
Правила обработки аномалий, связанных с летним временем и григорианским календарем, те же при добавлении/вычитании месяцев и лет, что и при добавлении/вычитании дней и недель.
Если присутствуют несколько пар «количество единиц измерения», они вычисляются последовательно слева направо.
Таймеры высокой точности
Большинство подкоманд, поддерживаемых командой clock, работают с временем, представленным как количество секунд с эпохи, и именно это представление возвращает clock seconds. Есть три исключения, все они предназначены для использования там, где требуется время с большей точностью. clock milliseconds возвращает количество миллисекунд с эпохи, а clock microseconds возвращает количество микросекунд с эпохи. Кроме того, есть команда clock clicks, которая возвращает таймер высокой точности, зависящий от платформы. В отличие от clock seconds и clock milliseconds, значение clock clicks не гарантируется, что связано с какой-либо фиксированной эпохой; оно просто предназначено для получения самого точного таймера интервалов, доступного, и предназначено только для относительных временных исследований, таких как бенчмаркинг.Форматирование времени
Команда clock format генерирует время для отображения пользователю или записи во внешний носитель. Команда принимает время, выраженное в секундах с эпохи 1 января 1970 года, 00:00 UTC, как возвращается clock seconds, clock scan, clock add, file atime или file mtime.Если присутствует опция -format, следующий аргумент — строка, которая определяет, как должна быть отформатирована дата и время. Строка состоит из любого количества символов, кроме знака процента (“%”), чередующихся с любым количеством групп форматирования, которые представляют собой двухсимвольные последовательности, начинающиеся со знака процента. Допустимые группы форматирования и их интерпретация описаны в разделе ГРУППЫ ФОРМАТИРОВАНИЯ.
Если присутствует опция -timezone, следующий аргумент — строка, которая определяет часовой пояс, в котором должна быть отформатирована дата и время. В качестве альтернативы «-timezone :UTC» может быть использовано устаревшее использование «-gmt true». См. раздел ЧАСОВЫЕ ПОЯСА для допустимых вариантов часового пояса.
Если присутствует опция -locale, следующий аргумент — строка, которая определяет локаль, в которой время должно быть отформатировано, в том же формате, что и для пакета msgcat. Обратите внимание, что значение по умолчанию, если -locale не указано, является основной локалью {}, а не текущей локалью. Текущую локаль можно получить, используя -locale current. Кроме того, некоторые платформы поддерживают локаль system, которая отражает текущие пользовательские настройки. Например, в Windows формат, который пользователь выбрал для дат и времени в Панели управления, можно получить, используя локаль system. На платформах, которые не определяют отдельного пользовательского выбора форматов дат и времени, отличного от LC_TIME, -locale system эквивалентно -locale current.
Сканирование времени
Команда clock scan принимает время, отформатированное в виде строк, и преобразует его в количество секунд с эпохи 1 января 1970 года, 00:00 UTC. Обычно она принимает опцию -format, за которой следует строка, описывающая ожидаемый формат входных данных. (См. раздел СКАНИРОВАНИЕ В СВОБОДНОЙ ФОРМЕ для эффекта команды clock scan без такого аргумента.) Строка состоит из любого количества символов, отличных от знака процента (“%”), чередующихся с любым количеством групп форматирования, которые представляют собой двухсимвольные последовательности, начинающиеся со знака процента. Допустимые группы форматирования и их интерпретация описаны в разделе ГРУППЫ ФОРМАТИРОВАНИЯ.Если присутствует опция -timezone, следующий аргумент — строка, которая определяет часовой пояс, в котором должна быть интерпретирована дата и время. В качестве альтернативы -timezone :UTC может использоваться устаревшее использование -gmt true. См. раздел ЧАСОВЫЕ ПОЯСА для допустимых вариантов часового пояса.
Если присутствует опция -locale, следующий аргумент — строка, которая определяет локаль, в которой нужно интерпретировать время, в том же формате, что используется в пакете msgcat. Обратите внимание, что по умолчанию, если -locale не указан, используется корневая локаль {}, а не текущая локаль. Текущую локаль можно получить, используя -locale current. Кроме того, некоторые платформы поддерживают локаль system, которая отражает текущие настройки пользователя. Например, в Windows формат, выбранный пользователем для дат и времени в Панели управления, можно получить, используя локаль system. На платформах, где выбор форматов дат и времени пользователем не отделён от LC_TIME, -locale system эквивалентно -locale current.
Если присутствует опция -base, следующий аргумент — время (выраженное в секундах с момента эпохи), используемое как базовое время для интерпретации относительных времен. Если опция -base не присутствует, базовым временем является текущее время.
Сканирование времени в фиксированном формате происходит путём определения трёх вещей: даты, времени суток и часового пояса. Затем эти три составляющие объединяются в точку во времени, которая возвращается в виде числа секунд с момента эпохи.
Перед началом сканирования строка формата преобразуется для замены %c, %Ec, %x, %Ex, %X. %Ex, %r, %R, %T, %D, %EY и %+ групп формата на эквиваленты, соответствующие текущей локали и не содержащие вышеуказанных групп. Например, %D (в локали en_US) будет заменено на %m/%d/%Y.
Дата определяется в соответствии с полями, присутствующими в преобразованной строке формата. В порядке предпочтения:
- Если строка содержит группу формата %s, представляющую секунды с момента эпохи, эта группа используется для определения даты.
- Если строка содержит группу формата %J, представляющую номер дня по Юлианскому календарю, эта группа используется для определения даты.
- Если строка содержит полный набор групп формата, указывающих век, год, месяц и день месяца; век, год и день года; или фискальный год ISO8601, неделю года и день недели; эти группы комбинируются и используются для определения даты. Если присутствует более одного полного набора, используется набор, расположенный правее в строке.
- Если в строке отсутствует век, но присутствует набор групп формата, указывающих год в веке, месяц и день месяца; год в веке и день года; или двухзначный фискальный год ISO8601, неделю года и день недели; эти группы комбинируются и используются для определения даты. Если присутствует более одного полного набора, используется набор, расположенный правее в строке. Год предполагается в диапазоне от 1938 до 2037 включительно.
- Если в строке полностью отсутствует указание года (или год указан только в альтернарном календаре локали) и присутствует набор групп формата, указывающих месяц и день месяца, день года или неделю года и день недели, эти группы комбинируются и используются для определения даты. Если присутствует более одного полного набора, используется набор, расположенный правее в строке. Год определяется путём интерпретации базового времени в заданном часовом поясе.
- Если строка не содержит ни одного из вышеперечисленных наборов, но содержит день месяца или день недели, день месяца или день недели используются для определения даты путём интерпретации базового времени в заданном часовом поясе и возвращения заданного дня текущей недели или месяца. (Неделя начинается с понедельника и заканчивается воскресеньем, по стандарту ISO8601). Если присутствуют и день месяца, и день недели, приоритет отдаётся дню месяца.
- Если ни одно из вышеперечисленных правил не приводит к пригодной дате, используется дата базового времени в заданном часовом поясе.
Время также определяется в соответствии с полями, присутствующими в преобразованной строке формата. В порядке предпочтения:
- Если строка содержит группу формата %s, представляющую секунды с момента эпохи, эта группа определяет время суток.
- Если строка содержит либо час по 24-часовому формату, либо час по 12-часовому формату плюс индикатор AM/PM, этот час определяет час дня. Если строка дополнительно содержит группу, указывающую минуту часа, эта группа объединяется с часом. Если строка дополнительно содержит группу, указывающую секунду минуты, эта группа объединяется с часом и минутой.
- Если строка не содержит ни группы формата %s, ни группы, указывающей час дня, то используется полночь (00:00, начало заданной даты). Часовой пояс определяется либо опциями -timezone или -gmt, либо с использованием текущего часового пояса.
Если в строке формата отсутствует группа формата %z или %Z, возможно, время будет неоднозначным, так как оно встречается дважды в один и тот же день, один раз без, а другой раз с летним временем. Если такая ситуация возникает, выбирается первое вхождение времени. (По этой причине рекомендуется включать в строку ввода часовой пояс при преобразовании местного времени. Это замечание не относится к UTC-времени.)
Группы формата
Следующие группы формата распознаются командами clock scan и clock format.- %a
- При выводе получает аббревиатуру (напр., Пн) для дня недели в заданном языке. При вводе соответствует имени дня недели в заданном языке (в сокращённой или полной форме, или любому уникальному префиксу любой из этих форм).
- %A
- При выводе получает полное имя (напр., Понедельник) дня недели в заданном языке. При вводе соответствует имени дня недели в заданном языке (в сокращённой или полной форме, или любому уникальному префиксу любой из этих форм).
- %b
- При выводе получает аббревиатуру (напр., Янв) для названия месяца в заданном языке. При вводе соответствует названию месяца в заданном языке (в сокращённой или полной форме, или любому уникальному префиксу любой из этих форм).
- %B
- При выводе получает полное название (напр., Январь) месяца в заданном языке. При вводе соответствует названию месяца в заданном языке (в сокращённой или полной форме, или любому уникальному префиксу любой из этих форм).
- %c
- При выводе получает локальное представление даты и времени суток; ожидается, что локальное представление использует григорианский календарь. При вводе соответствует тому, что производит %c.
- %C
- При выводе получает номер века в индо-арабских цифрах. При вводе соответствует одной или двум цифрам, возможно с ведущими пробелами, которые ожидаются как номер века.
- %d
- При выводе выводит число месяца, как две десятичные цифры. При вводе соответствует одной или двум цифрам, возможно с ведущими пробелами, которые ожидаются как число месяца.
- %D
- Этот формат группы синонимичен %m/%d/%Y. Он должен использоваться только при обмене данными в локали en_US, так как другие локали обычно не используют этот порядок для полей даты.
- %e
- При выводе выводит число месяца, как одну или две десятичные цифры (с ведущим пробелом для однозначных дат). При вводе соответствует одной или двум цифрам, возможно с ведущими пробелами, которые ожидаются как число месяца.
- %Ec
- При выводе выводит зависящее от локали представление даты и времени суток в альтернативном календаре локали. При вводе соответствует тому, что производит %Ec. Альтернативный календарь локали необязательно должен быть григорианским.
- %EC
- При выводе выводит зависящее от локали имя эры в альтернативном календаре локали. При вводе соответствует имени эры или любому уникальному префиксу.
- %EE
- При выводе выводит строку B.C.E. или C.E., или строку с тем же значением в локали, чтобы указать, относятся ли %Y к годам до или после года 1 нашей эры. При вводе принимает строку B.C.E., B.C., C.E., A.D. или сокращение, соответствующее текущей локали, и использует его для определения того, относятся ли %Y к годам до или после года 1 нашей эры.
- %Ex
- При выводе выводит зависящее от локали представление даты в альтернативном календаре локали. При вводе соответствует тому, что производит %Ex. Альтернативный календарь локали необязательно должен быть григорианским.
- %EX
- При выводе выводит зависящее от локали представление времени суток в альтернативных цифрах локали. При вводе соответствует тому, что производит %EX.
- %Ey
- При выводе выводит зависящее от локали число года эры в альтернативном календаре и цифрах локали. При вводе соответствует такому числу.
- %EY
- При выводе выводит представление года в альтернативном календаре и цифрах локали. При вводе соответствует тому, что производит %EY. Часто синонимичен %EC%Ey.
- %g
- При выводе выводит двухзначное число года, подходящее для использования с недельным календарем ISO8601; то есть, число года соответствует номеру недели, производимому %V. При вводе принимает такое двухзначное число года, возможно с ведущими пробелами.
- %G
- При выводе выводит четырёхзначное число года, подходящее для использования с недельным календарем ISO8601; то есть, число года соответствует номеру недели, производимому %V. При вводе принимает такое четырёхзначное число года, возможно с ведущими пробелами.
- %h
- Этот формат группы синонимичен %b.
- %H
- При выводе выводит двухзначное число, дающее час дня (00-23) по 24-часовому времени. При вводе принимает такое число.
- %I
- При выводе выводит двухзначное число, дающее час дня (12-11) по 12-часовому времени. При вводе принимает такое число.
- %j
- При выводе выводит трёхзначное число, дающее день года (001-366). При вводе принимает такое число.
- %J
- При выводе выводит строку цифр, дающую номер Джулианского дня. При вводе принимает строку цифр и интерпретирует её как номер Джулианского дня. Номер Джулианского дня — это количество календарных дней, прошедших с 1 января 4713 г. до н. э. пролептического юлианского календаря. Эпоха времени 1 января 1970 года соответствует номеру Джулианского дня 2440588.
- %k
- При выводе выводит одно- или двухзначное число, дающее час дня (0-23) по 24-часовому времени. При вводе принимает такое число.
- %l
- При выводе выводит одно- или двухзначное число, дающее час дня (12-11) по 12-часовому времени. При вводе принимает такое число.
- %m
- При выводе выводит номер месяца (01-12) с двумя цифрами. При вводе принимает две цифры и интерпретирует их как номер месяца.
- %M
- При выводе выводит число минуты часа (00-59) с двумя цифрами. При вводе принимает две цифры и интерпретирует их как число минуты часа.
- %N
- При выводе выводит номер месяца (1-12) с одной или двумя цифрами и ведущим пробелом для однозначных дат. При вводе принимает одну или две цифры, возможно с ведущими пробелами, и интерпретирует их как номер месяца.
- %Od, %Oe, %OH, %OI, %Ok, %Ol, %Om, %OM, %OS, %Ou, %Ow, %Oy
- Все эти форматы группы синонимичны своим аналогам без «O», за исключением того, что строка генерируется и анализируется в зависящих от локали альтернативных цифрах.
- %p
- При выводе выводит указатель части суток, AM или PM, соответствующий заданной локали. Если скрипт заданной локали поддерживает несколько форм букв, предпочтительнее строчные буквы. При вводе соответствует представлению AM или PM в заданной локали, в любом случае.
- %P
- При выводе выводит указатель части суток, am или pm, соответствующий заданной локали. Если скрипт заданной локали поддерживает несколько форм букв, предпочтительнее прописные буквы. При вводе соответствует представлению AM или PM в заданной локали, в любом случае.
- %Q
- Эта группа форматов зарезервирована для внутреннего использования в библиотеке Tcl.
- %r
- При выводе выводит зависящее от локали представление времени суток по 12-часовому времени. При вводе принимает то, что производит %r.
- %R
- При выводе время в 24-часовом формате (%H:%M). Для версии, включающей секунды, см. %T ниже. При вводе принимает то, что производит %R.
- %s
- При выводе просто форматирует аргумент timeVal как целое десятичное число и вставляет его в строку вывода. При вводе принимает целое десятичное число и использует его как значение времени без дальнейшей обработки. Поскольку %s однозначно определяет точку во времени, оно переопределяет все другие форматы ввода.
- %S
- При выводе выводит двухзначное число секунды минуты (00-59). При вводе принимает две цифры и использует их как секунду минуты.
- %t
- При выводе выводит символ TAB. При вводе соответствует символу TAB.
- %T
- Синоним %H:%M:%S.
- %u
- При выводе выводит номер дня недели (1→Понедельник, 7→Воскресенье). При вводе принимает одну цифру и интерпретирует её как день недели. Воскресенье может быть либо 0, либо 7.
- %U
- При выводе выводит порядковый номер недели года (00-53). Первое воскресенье года — первый день недели 01. При вводе принимает две цифры, которые в противном случае игнорируются. Этот формат группы никогда не используется для определения даты ввода. Это толкование недели года когда-то было распространённым в американском банкинге, но сейчас в значительной степени устарело. См. %V для номера недели ISO8601.
- %V
- При выводе выводит номер недели ISO8601 как двухзначное число (01-53). Неделя 01 — неделя, содержащая 4 января; или первая неделя года, содержащая по крайней мере 4 дня; или неделя, содержащая первую четверг года (три утверждения эквивалентны). Каждая неделя начинается с понедельника. При вводе принимает номер недели ISO8601.
- %w
- При выводе выводит порядковый номер дня недели (Воскресенье=0; Суббота=6). При вводе принимает одну цифру и интерпретирует её как день недели; Воскресенье может быть представлено как 0 или 7. Обратите внимание, что %w не является номером дня недели ISO8601, который генерируется и принимается %u.
- %W
- При выводе выводит номер недели (00-53) в году; неделя 01 начинается с первого понедельника года. При вводе принимает две цифры, которые в противном случае игнорируются. Этот формат группы никогда не используется для определения даты ввода. Это не номер недели ISO8601; эта неделя генерируется и принимается %V.
- %x
- При выводе выводит дату в представлении, зависящем от локали. При вводе принимает то, что производит %x, и используется для определения календарной даты.
- %X
- При выводе выводит время суток в представлении, зависящем от локали. При вводе принимает то, что производит %X, и используется для определения времени суток.
- %y
- При выводе выводит двухзначный год столетия. При вводе принимает две цифры и используется для определения календарной даты. Предполагается, что дата находится между 1938 и 2037 годами включительно. Обратите внимание, что %y не даёт год, подходящий для использования с номером недели ISO8601 %V; программы должны использовать %g для этой цели.
- %Y
- При выводе генерируется четырёхзначный календарный год. На входе принимаются четыре цифры и может быть использован для определения даты календаря. Обратите внимание, что %Y не даёт год, подходящий для использования с номером недели ISO8601 %V; программы должны использовать %G для этой цели.
- %z
- При выводе отображается текущая зона времени, выраженная в часах и минутах к востоку (+hhmm) или к западу (-hhmm) от Гринвича. На входе принимается спецификатор зоны времени (см. ЗОНЫ ВРЕМЕНИ ниже), который будет использован для определения зоны времени.
- %Z
- При выводе генерируется имя текущей зоны времени, возможно переведённое для заданного языка. На входе принимается спецификатор зоны времени (см. ЗОНЫ ВРЕМЕНИ ниже), который будет использован для определения зоны времени. Как правило, этот параметр следует использовать только при вводе для анализа дат в формате RFC822. Другое использование чревато неоднозначностью; например, строка BST может обозначать британское летнее время или бразильское стандартное время. Рекомендуется, чтобы строковые представления дат/времени для использования компьютера использовали числовые зоны времени.
- %%
- При выводе генерируется символ “%”. При вводе соответствует символу “%”.
- %+
- Синоним для “%a %b %e %H:%M:%S %Z %Y”.
Зоны времени
При обработке локального времени командой clock она может использовать несколько возможных источников для определения зоны времени. В порядке приоритета:- Зона времени, указанная внутри строки, анализируемой и сопоставляемой с группой форматов %z или %Z.
- Зона времени, указанная с помощью опции -timezone к команде clock (или, аналогично, -gmt 1).
- Зона времени, указанная в переменной окружения TCL_TZ.
- Зона времени, указанная в переменной окружения TZ.
- Локальная зона времени из Панели управления на системах Windows.
- Представление локальной зоны времени в библиотеке C, как определено функциями mktime и localtime.
В случае [1] только, строка проверяется на соответствие одному из следующих строк:
gmt ut utc bst wet wat at nft nst ndt ast adt est edt cst cdt mst mdt pst pdt yst ydt hst hdt cat ahst nt idlw cet cest met mewt mest swt sst eet eest bt it zp4 zp5 ist zp6 wast wadt jt cct jst cast cadt east eadt gst nzt nzst nzdt idle
Если это строка из вышеперечисленного списка, она обозначает известную зону времени и интерпретируется как таковая.
Для зон времени в случае [1], которые не совпадают ни с одной из вышеуказанных строк, и всегда для случаев [2]-[6], применяются следующие правила.
Если зона времени начинается с двоеточия, она относится к стандартизированному списку имён, например, :America/New_York, которые определяют правила для различных языковых локалей. Полный список имён расположений слишком длинный для перечисления здесь. На большинстве установок Tcl определения расположений находятся в именованных файлах в каталоге “/no_backup/tools/lib/tcl8.5/clock/tzdata”. На некоторых системах Unix эти файлы отсутствуют, и определения вместо этого извлекаются из системных файлов в “/usr/share/zoneinfo”, “/usr/share/lib/zoneinfo” или “/usr/local/etc/zoneinfo”. В качестве специального случая имя :localtime относится к локальной зоне времени, как определено библиотекой C.
Строка зоны времени, состоящая из знака плюс или минус, за которым следуют четыре или шесть десятичных цифр, интерпретируется как смещение в часах, минутах и секундах (если присутствуют шесть цифр) от UTC. Знак плюс обозначает зону к востоку от Гринвича, знак минус — к западу от Гринвича.
Строка зоны времени, соответствующая спецификации Posix переменной окружения TZ, будет распознана. Спецификация может быть найдена по адресу http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html.
Если строка зоны времени Posix содержит часть DST (переход на летнее время), но не содержит правила о том, когда DST начинается или заканчивается, то используются правила по умолчанию. Для временных зон со смещением от 0 до +12 используются текущие европейские/российские правила, в противном случае используются текущие правила США. В Европе (смещение +0 до +2) переход на летнее время осуществляется в последнюю субботу марта в 1:00 по Гринвичу, а переход обратно — в последнюю субботу октября в 2:00 по Гринвичу. В России (смещение +3 до +12) даты перехода такие же, только переход на летнее время осуществляется в 2:00 по местному времени, а переход обратно — в 3:00 по местному времени во всех часовых поясах. Переход США на летнее время происходит в второе воскресенье марта в 2:00 по местному времени, а переход обратно — в первое воскресенье ноября в 3:00 по местному времени. Эти правила по умолчанию означают, что во всех европейских, российских и американских (или совместимых) зонах времени вычисления DST будут корректны для дат 2007 года и позже, если в будущем правила не изменятся снова.
Любая другая строка зоны времени обрабатывается путём добавления двоеточия в начале и попытки использовать её как имя местоположения, как описано выше.
Локализация
Разработчики, желающие локализовать форматирование и обработку дат и времени, могут обратиться к спецификации по адресу http://tip.tcl.tk/173.Свободный поиск
Если команда clock scan вызывается без опции -format, то она запрашивает свободный поиск. Эта форма поиска устарела. Причина устаревания заключается в том, что существует слишком много неоднозначностей. (Представляет ли строка «2000» год, время суток или количество?) Не было найдено набора правил для интерпретации свободных дат и времён, которые давали бы предсказуемые результаты во всех случаях.Если используется свободный поиск, принимаются только опции -base и -gmt. Опции -timezone и -locale приведут к ошибке, если -format не указан.
Для пользы пользователей, которым нужно понять устаревший код, использующий свободный поиск, здесь приводится документация о том, как свободный поиск интерпретирует строку:
Если указано только время, предполагается текущая дата. Если строка inputString не содержит мнемонику зоны времени, предполагается локальная зона времени, если опция -gmt не установлена, в противном случае значение времени вычисляется, предполагая, что указанное время относится к Гринвичу. Опция -gmt, если она указана, влияет только на вычисленное значение времени, не затрагивая интерпретацию -base.
Если указан флаг -base, следующий аргумент должен содержать целочисленное значение времени. Используется только дата в этом значении, а не время. Это полезно для определения времени в определённый день или для выполнения других преобразований, связанных с датой.
Аргумент inputString состоит из нуля или более спецификаций следующего формата:
- time
- Время суток, имеющее вид: чч?:мм?:сс?? ?меридиан? ?зона? или ччмм ?меридиан? ?зона? Если не указан меридиан, чч интерпретируется по 24-часовому времени.
- date
- Конкретный месяц и день с необязательным годом. Допустимые форматы: «мм/дд?/гг?», «месяц дд?, гг?», «день, дд месяц ?гг?», «дд месяц гг», «?гггг?ггммдд», и «дд-месяц-?гггг?гг». Год по умолчанию — текущий год. Если год меньше 100, мы рассматриваем годы 00-68 как 2000-2068, а годы 69-99 как 1969-1999. Не все платформы могут представлять годы 38-70, поэтому может возникнуть ошибка, если эти годы используются.
- Спецификация ISO 8601 момента во времени
- Спецификация момента во времени в формате ISO 8601, например, «ггггммддТччммсс», где Т — буква «Т», «ггггммдд ччммсс», или «ггггммддТчч:мм:сс». Обратите внимание, что принимаются только эти три формата. Команда не принимает весь диапазон спецификаций моментов во времени, определённых в ISO8601. Другие форматы могут быть распознаны, указав явную опцию -format для команды clock scan.
- относительное время
- Спецификация, относящаяся к текущему времени. Формат — число единица. Допустимые единицы — год, полугодие, месяц, неделя, день, час, минута (или мин) и секунда (или сек). Единицу можно указать в единственном или множественном числе, как в 3 недели. Также могут быть указаны модификаторы: завтра, вчера, сегодня, сейчас, прошлый, этого, следующий, назад.
Фактическая дата вычисляется по следующим шагам.
Сначала обрабатывается и преобразуется любая абсолютная дата и/или время. Используя это время в качестве основы, добавляются спецификации дня недели. Затем используются относительные спецификации. Если указана дата или день, и не указано абсолютное или относительное время, используется полночь. Наконец, выполняется корректировка, чтобы получить правильный час дня после учёта перехода на летнее время и правильной даты при переходе от конца длинного месяца к короткому месяцу.
См. также
msgcatАвторские права
Авторские права (c) 2004 Kevin B. Kenny
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/clock.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/clock.htm