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

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

Жанры

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

Известно, например, что високосная секунда была добавлена в конец последнего дня 1998 года. Вслед за моментом 23:59:59 наступил редкий момент 23:59:60. Но стандартная библиотека языка С, которой пользуется Ruby, этого в расчет не принимает.

t0 = Time.gm(1998, 12, 31, 23, 59, 59)

t1 = t0 + 1

puts t1 # Fri Jan 01 00:00:00 GMT 1999

Быть может (хотя и маловероятно), Ruby скорректирует эту ситуацию. Но во время работы над данной книгой таких планов не было.

7.9. Определение порядкового номера дня в году

Порядковый

номер дня в году иногда еще называют юлианской датой, хотя это не имеет прямого отношения к юлианскому календарю, давно вышедшему из употребления. Многие считают, что такое название неправильно, поэтому мы им больше пользоваться не будем.

Но как ни называй порядковый номер дня, иногда хочется его узнать, то есть получить число от 1 до 366. В Ruby это просто — достаточно вызвать метод

yday
:

t = Time.now

day = t.yday # 315

7.10. Контроль даты и времени

В разделе 7.5 было показано, что стандартные функции не проверяют корректность даты, а «переносят» ее вперед, если необходимо. Например, 31 ноября становится 1 декабря.

Иногда такое поведение даже желательно. А если нет, то спешу обрадовать: стандартная библиотека Date не считает такие даты правильными. Мы можем воспользоваться этим фактом для контроля переданной даты.

class Time

 def Time.validate(year, month=1, day=1,

hour=0, min=0, sec=0, usec=0)

require "date"

begin

d = Date.new(year,month,day)

rescue

return nil

end

Time.local(year,month,day,hour,min,sec,usec)

 end

end

t1 = Time.validate(2000,11,30) # Создается корректный объект.

t2 = Time.validate(2000,11,31) # Возвращается nil.

Здесь не мудрствуя лукаво мы просто возвращаем

nil
, если переданные параметры не соответствуют правильной дате (полагаясь на вердикт, вынесенный классом
Date
). Мы оформили этот метод как метод класса Time по аналогии с другими методами создания объектов.

Отметим, что класс

Date
может работать и с датами, предшествующими точке отсчета, то есть дата 31 мая 1961 года с точки зрения этого класса вполне допустима. Но при попытке передать такие значения классу
Time
возникнет исключение
ArgumentError
. Мы не пытаемся его перехватить, полагая, что это лучше делать на том же уровне пользовательского кода, где обрабатывались бы исключения, скажем, от метода
Time.local
.

Раз уж зашла речь о

Time.local
, то отметим, что мы воспользовались именно этим методом. Захоти мы работать со временем по Гринвичу, нужно было бы вызывать метод
gmt
. Лучше реализовать оба варианта.

7.11.

Определение недели в году

Что такое «порядковый номер недели», не вполне ясно. Разные компании, коалиции, правительственные учреждения и органы стандартизации по-разному определяют это понятие. Путаница связана с тем, что год может начинаться с любого дня недели. Все зависит от того, хотим ли мы учитывать неполные недели. К тому же в одних странах неделя начинается с воскресенья, в других — с понедельника.

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

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

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

Координаты чудес (сборник)

Шекли Роберт
Шедевры фантастики
Фантастика:
научная фантастика
6.25
рейтинг книги
Координаты чудес (сборник)

Есть время жить

Негатин Игорь
Эпоха мертвых
Фантастика:
боевая фантастика
7.41
рейтинг книги
Есть время жить

Миллион приключений (сборник)

Булычев Кир
15. Отцы-основатели - Русское пространство. Кир Булычев - Собрание сочинений
Фантастика:
научная фантастика
7.00
рейтинг книги
Миллион приключений (сборник)

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.56
рейтинг книги
Сборник коротких эротических рассказов

Поезд смерти (Сборник)

Бирн Роберт
Мастера остросюжетного романа
Детективы:
техно триллер
6.25
рейтинг книги
Поезд смерти (Сборник)

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.50
рейтинг книги
Дважды одаренный. Том V

Карл Маркс

Серебрякова Галина Иосифовна
342. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Карл Маркс

Ночная охота (сборник)

Роллинс Джеймс
Книга-загадка, книга-бестселлер
Детективы:
триллеры
7.06
рейтинг книги
Ночная охота (сборник)

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Опыты

Монтень Мишель
Научно-образовательная:
философия
7.43
рейтинг книги
Опыты

Кукла

Прус Болеслав
Проза:
классическая проза
8.87
рейтинг книги
Кукла

Фантастика 1981

Биленкин Дмитрий Александрович
Фантастика
Фантастика:
научная фантастика
5.00
рейтинг книги
Фантастика 1981

Мой идеальный смерч

Джейн Анна
1. Мой идеальный смерч
Юмор:
юмористическая проза
9.18
рейтинг книги
Мой идеальный смерч

Закат владыки морей

Смит Питер Чарльз
Военно-историческая библиотека
Научно-образовательная:
история
5.00
рейтинг книги
Закат владыки морей