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

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

Жанры

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

Учтите, что

parsedate
практически не контролирует ошибки. Например, если подать ему на вход дату, в которой день недели установлен некорректно, то он несоответствия не обнаружит. Это всего лишь анализатор — со своей работой он справляется неплохо, а требовать от него большего было бы неправильно.

Следует особо отметить склонность этого кода к «американизмам». Когда американец пишет 3/4/2001, он обычно имеет в виду 4 марта 2001 года. В Европе и большинстве других мест это означает 3 апреля. Но если при записи всех дат применяется одно и то же соглашение, ничего страшного не произойдет. Ведь возвращается просто массив, и ничто не мешает вам мысленно

переставить первый и второй элементы. Кстати, имейте в виду, что вышеописанным образом интерпретируется даже такая дата, как 15/3/2000, хотя нам совершенно очевидно, что 15 — это день, а не месяц. Метод же
parsedate
«на голубом глазу» сообщит, что 15 — номер месяца!..

7.21. Форматирование и печать даты и времени

Для получения канонического представления даты и времени служит метод

asctime
; У него есть синоним
ctime
.

Аналогичный результат дает метод

to_s
. Точно такая же строка будет напечатана, если просто передать объект, представляющий дату и время, методу puts.

С помощью метода

strftime
класса
Time
можно отформатировать дату и время почти произвольным образом. В этой главе мы уже встречали спецификаторы
%a
,
%A
,
%U
,
%W
,
%H
,
%M
,
%S
,
%I
и
%p
, а ниже приведены оставшиеся:

%b 
Сокращенное название месяца (
"Jan"
)

%B 
Полное название месяца (
"January"
)

%c 
Предпочтительное представление локальной даты и времени

%d 
День месяца (
1..31
)

%j 
Порядковый номер дня в году (
1..366
); так называемая «юлианская дата»

%m 
Номер месяца (
1..12
)

%w 
Номер дня недели (
0..6
)

%x 
Предпочтительное представление даты без времени

%y 
Год в двузначном формате (без указания века)

%Y 
Год в четырехзначном формате

%Z 
Название часового пояса

%% 
Знак
%
(процент)

Дополнительную информацию вы найдете в справочном руководстве по языку Ruby.

7.22. Преобразование часовых поясов

Обычно приходится работать только с двумя часовыми поясами: GMT (или UTC) и тем, в котором вы находитесь.

Метод

gmtime
преобразует время к поясу GMT (модифицируя сам вызывающий объект). У него есть синоним
utc
.

Может быть, вы думаете, что можно просто преобразовать момент времени в массив, подменить часовой пояс и выполнить обратное преобразование? Проблема в том, что все методы класса, к примеру

local
и
gm
(а также их синонимы
mktime
и
utc
), готовы создавать объект
Time
только
в предположении, что указано либо местное время, либо время по Гринвичу.

Есть обходной путь для преобразования часового пояса. Но предполагается, что вы заранее знаете разницу во времени. Взгляните на следующий фрагмент:

mississippi = Time.local(2000,11,13,9,35) # 9:35 am CST

california = mississippi - 2*3600 # Минус два часа.

time1 = mississippi.strftime("%X CST") # 09:35:00 CST

time2 = california.strftime("%X PST") # 07:35:00 PST

Спецификатор

%x
в методе
strftime
просто выводит время в формате
hh:mm:ss
.

7.23. Определение числа дней в месяце

В текущей версии Ruby еще нет встроенной функции для этой цели. Но ее можно без труда написать самостоятельно:

require 'date'

def month_days(month,year=Date.today.year)

 mdays = [nil,31,28,31,30,31,30,31,31,30,31.30,31]

 mdays[2] = 29 if Date.leap?(year)

 mdays[month]

end

days = month_days(5) # 31 (May)

days = month_days(2,2000) # 29 (February 2000)

days = month_days(2,2100) # 28 (February 2000)

7.24. Разбиение месяца на недели

Представьте, что нужно разбить месяц на недели, например чтобы напечатать календарь. Эту задачу решает приведенный ниже код. Возвращаемый массив состоит из подмассивов, по семь элементов в каждом. При этом первому элементу каждого внутреннего массива соответствует воскресенье. Начальные элементы для первой недели и конечные для второй могут быть равны

nil
.

def calendar(month,year)

 days = month_days(month,year)

 t = Time.mktime(year,month,1)

 first = t.wday

 list = *1..days

 weeks = [[]]

 week1 = 7 - first

 week1.times { weeks[0] << list.shift }

 nweeks = list.size/7 + 1

 nweeks.times do |i|

weeks[i+1] ||= []

7.times do

break if list.empty?

weeks[i+1] << list.shift

end

 end

 pad_first = 7-weeks[0].size

 pad_first.times { weeks[0].unshift(nil) }

 pad_last = 7-weeks[0].size

 pad_last.times { weeks[-1].unshift(nil) }

 weeks

end

arr = calendar(12,2008) # [[nil, 1, 2, 3, 4, 5, 6],

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

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Телохранитель Генсека. Том 1

Противостояние

Гаевский Михаил
2. Стратег
Фантастика:
боевая фантастика
космическая фантастика
5.25
рейтинг книги
Противостояние

Вагант

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

Изгой Проклятого Клана

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

Развод. Без права на ошибку

Ярина Диана
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод. Без права на ошибку

Лекарь Империи 3

Карелин Сергей Витальевич
3. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 3

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Первый среди равных. Книга VIII

Бор Жорж
8. Первый среди Равных
Фантастика:
аниме
фантастика: прочее
эпическая фантастика
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VIII

Позывной "Князь"

Котляров Лев
1. Князь Эгерман
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Позывной Князь

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

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Неудержимый. Книга X

Боярский Андрей
10. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга X

Отморозок 4

Поповский Андрей Владимирович
4. Отморозок
Фантастика:
попаданцы
фантастика: прочее
5.00
рейтинг книги
Отморозок 4