Во-первых, цитата:
сложны, ассиметричны и раздельны, что делать связанные вычисления в уме по времени невозможно. На самом деле, если некий Бог-тиран изобретал бы способ подчинить наш ум времени, чтобы сделать невозможной для нас возможность вырваться из подчинения сырым шаблонам и неприятным сюрпризам, он вряд ли мог сделать лучше, чем передать нашу современную систему. Это подобно набору трапецидальных строительных блоков без вертикальных и горизонтальных поверхностей, языку, в котором простейшая мысль требует витиеватых конструкций. В отличие от более успешных образцов языка и науки, которые позволяют нам видеть опыт широко или по крайней мере на высоком уровне, наша система измерения времени тихо и постоянно поощряет наш террор времени.
... Это подобно измерению длины в футах, ширины -- в метрах, а высоты --- в локтях, если базовые руководства требуют знания пяти различных языков. Это не чудо когда мы смотрим в наше недавнее прошлое или ближайшее будущее, прошлый вторник или неделю после воскресенья, с ощущением беспомощности. ...
-- Роберт Грудин, `Время и искусство жить'.
Этот раздел описывает текстовые представления даты, принимаемые программами GNU. Это строки, которые Вы как пользователь можете передать в качестве аргументов различным программам. C-интерфейс (через функцию `getdate') здесь не описывается.
Хотя этот синтаксис даты может представлять любое время начиная с нуля н.э., целые числа компьютеров недостаточно велики для такого (сравнительно) большого отрезка времени. Самая ранняя дата семантически допустимая на Unix системах -- это полночь 1 января 1970 г.
"Дата" -- это строка, возможно пустая, содержащая много элементов, разделенных пробелами. Пробел может быть опущен, если не появляются никакие неоднозначности. Пустая строка означает начало сегодняшнего дня (т.е. полночь). Порядок пунктов несущественен. Строка даты может содержать много разных пунктов:
Мы опишем каждый из этих типов элементов по очереди ниже.
Несколько чисел могут быть написаны словами в большинстве случаев. Это наиболее полезно для указания дня недели или относительных пунктов (см. ниже). Вот список: `first' -- 1, `next' -- 2, `third' -- 3, `fourth' -- 4, `fifth' -- 5, `sixth' -- 6, `seventh' -- 7, `eighth' -- 8, `ninth' -- 9, `tenth' -- 10, `eleventh' -- 11 и `twelfth' -- 12. Также `last'означает -1.
Когда месяц указывается таким образом, предполагается, что он указан численно, вместо "чтение полностью по буквам"; это изменяет допустимые строки.
Регистр букв полностью игнорируется в датах. Коментарии могут быть введены в круглых скобках, если включенные скобки правильно вложены. Дефисы без следующей за ними цифрой в начтоящее время игнорируютя. Лидирующие нули в числах игнорируются.
"Календарная дата" указывает день года. Она указывается различными
способами, в зависимости от того, указывается месяц численно или
прописью. Все эти строки указывают одну календаную дату:
1970-09-17 # ISO 8601.
70-9-17 # По умолчанию XX век используется.
70-09-17 # Лидирующие нули игнорируются.
9/17/72 # Обычная запись в США.
24 September 1972
24 Sept 72 # September имеет специальное сокращение.
24 Sep 72 # Трехбуквенные сокращения также допускаются.
Sep 24, 1972
24-sep-72
24sep72
Год может быть опущен. В этом случае, используется последний указанный
год, если такого нет -- текущий. Например:
9/17
sep 17
Здесь приведены правила.
Если месяц указан числом, допустим формат ISO 8601 `ГОД-МЕСЯЦ-ДЕНЬ', где ГОД -- это любое положительное число, МЕСЯЦ -- число между 01 и 12, ДЕНЬ -- число от 01 до 31. Лидирующий нуль должен быть указан, если число меньше 10. Если ГОД меньше 100, то 1900 добавляется к нему, для образования даты в XX веке. Конструкция `МЕСЯЦ/ДЕНЬ/ГОД', популярная в США допустима. Также `МЕСЯЦ/ДЕНЬ', опуская год.
Названия месяцев могут быть указаны полностью: `January', `February', `March', `April', `May', `June', `July', `August', `September', `October', `November' or `December'. Названия месяцев могут быть сокращены до первых трех символов, возможно заканчивающихся точкой. Также можно писать `Sept' вместо `September'.
Когда месяцы указаны прописью, календарная дата может быть задана
следующим образом:
ДЕНЬ МЕСЯЦ ГОД
ДЕНЬ МЕСЯЦ
МЕСЯЦ ДЕНЬ ГОД
ДЕНЬ-МЕСЯЦ-ГОД
Или, опуская год:
МЕСЯЦ ДЕНЬ
"Время суток" в строках даты указывает время в данный день. Вот
несколько примеров, представляющие одно и то же время:
20:02:0
20:02
8:02pm
20:02-0500 # В EST (Стандартное восточное время в США).
В общем случае время суток задается в виде `ЧАС:МИНУТЫ:СЕКУНДЫ', где ЧАС -- эточисло между 0 и 23, МИНУТЫ -- число между 0 и 59, СЕКУНДЫ -- число между 0 и 59. `:СЕУКНДЫ' могут быть опущены, в этом случае они считаются равными нулю.
Если после времени указывается `am' или `pm' (или `a.m.' или `p.m.') ЧАС долен быть от 1 до 12, `:МИНУТЫ' можно опустить (считаются равными нулю). `am' указывает на первую половину дня, `pm' -- на вторую. В такой записи 12 предшествует 1: полночь это `12am', полдень -- `12pm'.
После времени может быть указан часовой пояс в виде `ЗЧЧММ', где З -- `+' или `-', ЧЧ -- количество часов в поясе, ММ -- количество минут в поясе. Когда часовой пояс задан таким образом, время интерпретируется относительно Coordinated Universal Time (UTC), перекрывая любые предыдущие спецификации часового пояса или местный частовой пояс. МИНУТЫ во времени суток не могут быть опущены, если указан часовой пояс. Это единственный способ указать часовой пояс используя дробные части часа.
Или `am'/`pm' или часовой пляс могут быть указаны, но не оба.
"Часовой пояс" определяет международный часовой пояс, указываемый небоьшим количеством букв. Они поддерживаются для обратной совместимости и не рекомендуются, потому что они неодносзначны на практике: сокращение `EST' имеет разное значение в США и Австралии. Точки игнорируются. В настоящее время только целые часы в поясах огут быть представлены в "часовом поясе". См. предыдущий раздел для лучшего управления часовыми поясами.
Здесь приведены не сберегащие дневное время часовые пояса, индексированные по поясному часу
Здесь приведены сберегающие дневное время часовые пояса, индексированные по поясному часу. Также окончивая не сберегающие дневное время часовые пояса строкой `DST' отдельным словом (отделенным пробелом), соответсвующий сберегающий дневное время часовой пояс может быть указан.
Явное указание дня недели увеличавает дату (только в случае необходимости) для достижения того дня недели в будущем.
Дни недели могут быть написаны полностью: `Sunday', `Monday', `Tuesday', `Wednesday', `Thursday', `Friday' or `Saturday'. Дни могут быть сокращены до первых трех букв, возможно заканичаващихся точкой. Специальные сокращения `Tues' для `Tuesday', `Wednes' для `Wednesday' и `Thur' или `Thurs' для `Thursday' также допустимы.
Число может предшествовать дню недели для сдвига вперед дополнительных недель. Лучше всего это использовать в выражениях вида `third monday'. В этом контексте `last ДЕНЬ' или `next ДЕНЬ' также допустимы; они сдигают на неделю вперед или назад день, представляемый ДНЕМ.
Запятая, следующая за днем недели, игнорируется
"Относительные элементы" устанавливают дату (или текущюу дату) вперед
или назад. Эффект относительных пукнктов накпиливается. Вот несколько
примеров.
1 year
1 year ago
3 years
2 days
Единица изменения времени может быть выбрана строкой `year' или `month' для изменения на целы годы или месяцы. Это не точные единицы, т.к. не все месяцы и годы имеют одинаковую продолжительность. Более точные единицы это: `fortnight', которая значаит 14 дней, `week' --- 7 дней, `day' -- 24 часа, `hour' -- 60 минут, `minute' или `min' --- 60 секунд и `second' или `sec' -- 1 секунда. Суффикс `s' для этих единииц допустим и игнорируется.
Единица времени может быть предворена множителем, данным как возможно число со знаком. Беззнаковые числа считатются положительными. Отсутсвие числа применяет 1 как множитель. Указывая за относительным пунктам слово `ago' эквивалентно предварению единицы множителем -1.
Строка `tomorrow' значит один день в будущее, завтра, (эквивалентно `day'), строка `yesterday' -- один день в прошлое, вчера, (эквивалентно `day ago').
Строки `now' или `today' -- это относительные пункты, указывающие нулевое смещение даты, эти строки исходят из факта, что нулевое смещение представляет собой текущее время, если предыдущие пункты его не изменили. Они могут использоваться для выделить другие пункты, как, например, в `12:00 today'. Строка `this' также иммет смысл нудевого смещения времени, но предподчительно в строках даты как `this thursday'.
Когда относительный пункт изменяет дату так, что сберегающий дневное время часовой пояс сменяется на не сберегающий дневное время часовой пояс или наоборот, что время выавнивается в соответвии с местным временем.
Точная интерпретация непосредственного десятичного числа заисит от контекста в строке даты.
Если десятичное число имеет вид ГГГГММДД и никаких элементов календарной даты (раздел 3.2 Календарная дата перед ним нет в этой строке даты, то ГГГГ означает год, ММ -- месяц, а ДД -- день месяца.
Если десятичное число имеет вид ЧЧММ и никаких элементов времени суток перед ним нет в этой строке даты, то ЧЧ означает час суток, а ММ -- минуты часа. ММ может быть опущено.
Если календарная дата и время суток записаны слева от числа в строке даты, и нет относительных элементов, то число переопределяет год.
`getdate' был первоначально реализован Стивеном М. Белловином (smb@research.att.com) в Университете Северной Каролины. Код был позже подправлен парой людей из Usenet, затем полностью переработан Ричем Сальцем (rsalz@bbn.com) и Джимом Беретсом (jberets@bbn.com) в августе 1990. Различные ревизии для системы GNU были сделаны Дэвидом МакКензи, Джимом Мейерингом и др.
Эта глава первоначально была создана Franc,ois Pinard (Френсисом Пинардом, наверное, если кому известно как его имя читается по-русски напишите) (pinard@iro.umontreal.ca) из исходных текстов `getdate.y', а затем подкорректирована К. Берри (kb@cs.umb.edu).