Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

В этом разделе мы предложим три варианта. Первые два основаны на методе

strftime
класса
Time
. Спецификатор
%U
отсчитывает недели, начинающиеся с воскресенья, а спецификатор
%W
— начинающиеся с понедельника.

Третью возможность предоставляет класс

Date
. В нем имеется метод доступа
cweek
, который возвращает порядковый номер недели, следуя определению из стандарта ISO 8601 (согласно которому первой считается неделя, содержащая первый вторник года).

Если все это вам не подходит, можете придумать собственный алгоритм. Все три решения включены в один фрагмент кода:

require "date"

# Посмотрим, в какую неделю попадает 1 мая в 2002 и 2005 годах.

t1 = Time.local(2002,5,1)

d1 = Date.new(2002,5,1)

week1a = t1.strftime("%U").to_i # 17

week1b = t1.strftime("%W").to_i # 17

week1c = d1.cweek #18

t2 = Time.local(2005,5,1)

d2 = Date.new(2005,5,1)

week2a = t2.strftime("%U").to_i # 18

week2b = t2.strftime("%W").to_i # 18

week2c = d2.cweek # 17

7.12. Проверка года на високосность

В классе

Date
есть два метода класса
julian_leap?
и
gregorian_leap?
, но только последний применим к относительно недавнему времени. Есть также метод
leap?
, но это просто синоним
gregorian_leap?
.

require "date"

flag1 = Date.julian_leap? 1700 # true

flag2 = Date.gregorian_leap? 1700 # false

flag3 = Date.leap? 1700 # false

Любой ребенок знает первое правило проверки на високосность: год должен делиться на 4. Меньшее число людей знают второе правило: год не должен делиться на 100. И уж совсем немногие знают про исключение из второго правила: если год делится на 400, то он високосный. Таким образом, последний год тысячелетия является високосным, только если делится на 400; так, 1900 год не был високосным, а 2000 был. (Эта поправка необходима, потому что в году не ровно 365.25 дней, а приблизительно 365.2422.)

В классе

Time
нет аналогичного метода, но при желании его легко можно добавить.

class Time

 def Time.leap? Year

if year % 400 == 0

true

elsif year % 100 == 0

false

elsif year % 4 == 0

true

else

false

 end

end

Я привел этот код только для того, чтобы прояснить алгоритм; конечно, гораздо проще вызвать метод

Date.leap?
. В моей реализации это метод класса по аналогии с классом
Date
, но можно было бы сделать его и методом экземпляра.

7.13. Определение часового пояса

Метод

zone
класса
Time
возвращает название часового пояса в виде строки:

z1 = Time.gm(2000,11,10,22,5,0).zone # "GMT-6:00"

z2 = Time.local(2000,11,10,22,5,0).zone # "GMT-6:00"

К сожалению, время хранится относительно текущего часового пояса, а не того, для которого был создан объект. При желании можно скорректировать его самостоятельно.

7.14. Манипулирование временем без даты

Иногда нужно работать с временем дня в виде строки. На помощь снова приходит метод

strftime
. Можно «разбить» время на часы, минуты и секунды

t = Time.now

puts t.strftime("%H:%M:%S") # Печатается 22:07:45

А можно только на часы и минуты (прибавив 30 секунд, мы даже можем округлить до ближайшей минуты):

puts t.strftime("%Н:%М") # Печатается 22:07

puts (t+30).strftime("%Н:%М") # Печатается 22:08

Наконец, со стандартного 24-часового представления можно переключиться на 12-часовой формат, добавив признак перехода через полдень (АМ/РМ):

puts t.strftime("%I:%М %p") # Печатается 10:07 PM

Есть и другие возможности — поэкспериментируйте!

7.15 Сравнение моментов времени

К классу

Time
подмешан модуль
Comparable
, поэтому моменты времени можно сравнивать непосредственно:

  • Читать дальше
  • 1
  • ...
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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