Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Метод

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).

day = time.strftime("%а") # "Tue"

Можно получить и полное название:

long = time.strftime("%А") # "Tuesday"

7.4. Определение даты Пасхи

Дату этого праздника всегда было сложно вычислить, так как она привязана к лунному календарю. Солнечный год не делится нацело на лунные месяцы, поэтому даты, основанные на таком исчислении времени, будут из года в год меняться.

Представленный ниже алгоритм хорошо известен с давних времен. Мы видели его реализацию на языках BASIC, Pascal и С. А теперь перевели и на Ruby:

def easter(year)

 с = year/100

 n = year - 19*(year/19)

 k = (c-17)/25

 i = с - c/4 - (c-k)/3 + 19*n + 15

 i = i - 30*(i/30)

 i = i - (i/28)* (1 -(i/28)*(29/(i + 1))*((21-n)/11))

 j = year + year/4 + i + 2 - с + c/4

 j = j - 7*(j/7)

 l = i - j

 month = 3 + (1+40)/44

 day = l + 28 — 31*(month/4)

 [month, day]

end

date = easter 2001 # Найти месяц и день для 2001 года,

date = [2001] + date # Добавить в начало год.

t = Time.local *date # Передать параметры Time.local.

puts t # Sun Apr 15 01:00:00 GMT-8:00 2001

Кто-то, прочитав этот раздел о Пасхе, непременно спросит: «Церковная или астрономическая?» Честно говоря, не знаю. Если вам удастся выяснить, сообщите всем нам.

Поделиться:
Популярные книги

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Вперед в прошлое 6

Ратманов Денис
6. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 6

Черный дембель. Часть 4

Федин Андрей Анатольевич
4. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 4

Двойник короля 13

Скабер Артемий
13. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 13

Железный Воин Империи

Зот Бакалавр
1. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Железный Воин Империи

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Локки 8. Потомок бога

Решетов Евгений Валерьевич
8. Локки
Фантастика:
фэнтези
боевая фантастика
героическая фантастика
попаданцы
5.00
рейтинг книги
Локки 8. Потомок бога

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Лондон

Резерфорд Эдвард
The Big Book
Проза:
историческая проза
6.67
рейтинг книги
Лондон

Идеальный мир для Лекаря 27

Сапфир Олег
27. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 27

Институт

Кинг Стивен
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Институт

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья