На летнее время переходят раз в полгода, сдвигая официальное время на один час. Поэтому обозначения часовых поясов в США обычно заканчиваются на ST (Standard Time — стандартное время) или DT (Daylight Time — летнее время). Это происходит в большинстве штатов США (если не во всех), да и во многих других странах.
Точка отсчета (epoch) — термин, пришедший из мира UNIX. В этой системе время обычно хранится как число секунд, прошедших с определенного момента (называемого точкой отсчета), а именно с полуночи 1 января 1970 года по Гринвичу.
(Отметим, что во временных поясах США точкой отсчета оказывается 31 декабря предыдущего года). Тем же словом обозначается не только начальный момент, но и время, прошедшее с этого момента.
Для выполнения большинства операций используется класс Time
. Классы Date
и DateTime
обеспечивают дополнительную гибкость.
7.1. Определение текущего момента времени
Самый главный вопрос при манипуляциях с датами и временем: какой сегодня день и сколько сейчас времени? В Ruby при создании объекта класса Time
без параметров устанавливаются текущие дата и время.
t0 = Time.new
Синонимом служит
Time.now: t0 = Time.now
Отметим, что разрешающая способность системного таймера на разных машинах различна. Иногда это микросекунды; в таком случае два объекта Time
, созданных подряд, могут фиксировать разное время.
7.2. Работа с конкретными датами (после точки отсчета)
Большинству программ нужно работать только с датами, относящимися к будущему или недавнему прошлому. Для таких целей класса Time
достаточно. Наиболее интересны методы mktime
, local
, gm
и utc
.
Метод mktime
создает новый объект Time
на основе переданных параметров. Параметры задаются по убыванию длительности промежутка: год, месяц, день, часы, минуты, секунды, микросекунды. Все параметры, кроме года, необязательны; по умолчанию предполагается минимально возможное значение. В некоторых машинных архитектурах микросекунды игнорируются. Час выражается числом от 0 до 23.
t1 = Time.mktime(2001) # 1 января 2001 года, 0:00:00
t2 = Time.mktime(2001,3)
t3 = Time.mktime(2001,3,15)
t4 = Time.mktime(2001,3,15,21)
t5 = Time.mktime(2001,3,15,21,30)
t6 = Time.mktime(2001,3,15,21,30,15) # 15 марта 2001 года, 21:30:15
Отметим, что в методе mktime
используется местное поясное время. Поэтому у него есть синоним T ime.local
.
t7 = Time.local(2001,3,15,21,30,15) # 15 марта 2001 года, 21:30:15
Метод Time.gm
, по сути, делает то же самое, но в нем предполагается время GMT (или UTC). Поскольку автор книги проживает в центральном часовом поясе США, то разница составляет 8 часов:
t8 = Time.gm(2001,3,15,21,30,15) # March 15, 2001 21:30:15 pm
# Это 13:30:15 по центральному времени!
У этого метода есть синоним Time.utc
:
t9 = Time.utc(2001,3,15,21,30,15) # March 15, 2001 21:30:15 pm
# Снова 13:30:15 по центральному времени.
Отметим одну важную вещь. Все эти методы могут принимать и альтернативный набор параметров. Метод экземпляра to_a
(который преобразует время в массив отдельных компонентов) возвращает набор значений в следующем порядке: секунды, минуты, часы, день, месяц, год, день недели ( 0..6
), порядковый номер дня в году ( 1..366
), летнее время ( true
или false
), часовой пояс (строка). Поэтому такие вызовы тоже допустимы:
t0 = Time.local(0,15,3,20,11,1979,2,324,false,"GMT-8:00")
t1 = Time.gm(*Time.now.to_a)
Однако, глядя на первый пример, не думайте, что вы сможете изменить вычисляемые параметры, например день недели (в данном случае 2 означает вторник). Такое действие противоречило бы принципам организации календаря, поэтому на созданном объекте Time
оно никак не отражается. 20 ноября 1979 года был вторник, и никакой код не сможет этого изменить.
И наконец, отметим, что есть много способов задать время некорректно, например указав тринадцатый месяц или 35-й день месяца. При любой подобной попытке возникнет исключение ArgumentError
.
7.3. Определение дня недели
Есть несколько способов определить день недели. Во-первых, метод экземпляра to_a
возвращает массив, содержащий всю информацию о моменте времени. Можно обратиться к его седьмому элементу; это число от 0 до 6, причем 0 соответствует воскресенью, а 6 — субботе.
time = Time.now
day = time.to_a[6] # 2 (вторник)
Еще лучше воспользоваться методом экземпляра wday
:
day = time.wday # 2 (вторник)
Но и тот, и другой способ не очень удобны. Иногда нужно получить день недели в виде числа, но чаще нас интересует его название в виде строки. Для этого можно обратиться к методу strftime
. Его название знакомо программистам на С. Он распознает около двадцати спецификаторов, позволяя по-разному форматировать дату и время (см. раздел 7.21).
Читать дальше
Конец ознакомительного отрывка
Купить книгу