Учебники

Рубин — Дата и время

Класс Time представляет даты и время в Ruby. Это тонкий слой над системной датой и временем, предоставляемыми операционной системой. Этот класс может быть не в вашей системе для представления дат до 1970 или после 2038 года.

Эта глава знакомит вас со всеми наиболее востребованными понятиями даты и времени.

Получение текущей даты и времени

Ниже приведен простой пример получения текущей даты и времени.

Live Demo

#!/usr/bin/ruby -w

time1 = Time.new
puts "Current Time : " + time1.inspect

# Time.now is a synonym:
time2 = Time.now
puts "Current Time : " + time2.inspect

Это даст следующий результат —

Current Time : Mon Jun 02 12:02:39 -0700 2008
Current Time : Mon Jun 02 12:02:39 -0700 2008

Получение компонентов даты и времени

Мы можем использовать объект Time для получения различных компонентов даты и времени. Ниже приведен пример, показывающий то же самое —

Live Demo

#!/usr/bin/ruby -w

time = Time.new

# Components of a Time
puts "Current Time : " + time.inspect
puts time.year    # => Year of the date 
puts time.month   # => Month of the date (1 to 12)
puts time.day     # => Day of the date (1 to 31 )
puts time.wday    # => 0: Day of week: 0 is Sunday
puts time.yday    # => 365: Day of year
puts time.hour    # => 23: 24-hour clock
puts time.min     # => 59
puts time.sec     # => 59
puts time.usec    # => 999999: microseconds
puts time.zone    # => "UTC": timezone name

Это даст следующий результат —

Current Time : Mon Jun 02 12:03:08 -0700 2008
2008
6
2
1
154
12
3
8
247476
UTC

Функции Time.utc, Time.gm и Time.local

Эти две функции можно использовать для форматирования даты в стандартном формате следующим образом:

# July 8, 2008
Time.local(2008, 7, 8)  
# July 8, 2008, 09:10am, local time
Time.local(2008, 7, 8, 9, 10)   
# July 8, 2008, 09:10 UTC
Time.utc(2008, 7, 8, 9, 10)  
# July 8, 2008, 09:10:11 GMT (same as UTC)
Time.gm(2008, 7, 8, 9, 10, 11)  

Ниже приведен пример получения всех компонентов в массиве в следующем формате:

[sec,min,hour,day,month,year,wday,yday,isdst,zone]

Попробуйте следующее —

Live Demo

#!/usr/bin/ruby -w

time = Time.new
values = time.to_a
p values

Это сгенерирует следующий результат —

[26, 10, 12, 2, 6, 2008, 1, 154, false, "MST"]

Этот массив можно передать в функции Time.utc или Time.local, чтобы получить другой формат дат следующим образом:

Live Demo

#!/usr/bin/ruby -w

time = Time.new
values = time.to_a
puts Time.utc(*values)

Это сгенерирует следующий результат —

Mon Jun 02 12:15:36 UTC 2008

Ниже приведен способ получения времени, представленного внутренне в секундах с (зависимой от платформы) эпохи —

# Returns number of seconds since epoch
time = Time.now.to_i  

# Convert number of seconds into Time object.
Time.at(time)

# Returns second since epoch which includes microseconds
time = Time.now.to_f

Часовые пояса и летнее время

Вы можете использовать объект Time для получения всей информации, связанной с часовыми поясами и переходом на летнее время, следующим образом:

time = Time.new

# Here is the interpretation
time.zone       # => "UTC": return the timezone
time.utc_offset # => 0: UTC is 0 seconds offset from UTC
time.zone       # => "PST" (or whatever your timezone is)
time.isdst      # => false: If UTC does not have DST.
time.utc?       # => true: if t is in UTC time zone
time.localtime  # Convert to local timezone.
time.gmtime     # Convert back to UTC.
time.getlocal   # Return a new Time object in local zone
time.getutc     # Return a new Time object in UTC

Форматирование времени и даты

Существуют различные способы форматирования даты и времени. Вот один пример, показывающий несколько —

Live Demo

#!/usr/bin/ruby -w

time = Time.new
puts time.to_s
puts time.ctime
puts time.localtime
puts time.strftime("%Y-%m-%d %H:%M:%S")

Это даст следующий результат —

Mon Jun 02 12:35:19 -0700 2008
Mon Jun  2 12:35:19 2008
Mon Jun 02 12:35:19 -0700 2008
2008-06-02 12:35:19

Директивы форматирования времени

Эти директивы в следующей таблице используются с методом Time.strftime .

Sr.No. Директива и описание
1

% в

Сокращенное название дня недели (Солнце).

2

% A

Полное название дня недели (воскресенье).

3

% б

Сокращенное название месяца (январь).

4

% В

Полное название месяца (январь).

5

% с

Предпочтительное местное представление даты и времени.

6

% d

День месяца (с 01 по 31).

7

%ЧАС

Час дня, круглосуточные часы (с 00 до 23).

8

Час дня, 12-часовые часы (с 01 до 12).

9

% J

День года (от 001 до 366).

10

% м

Месяц года (от 01 до 12).

11

% M

Минута часа (от 00 до 59).

12

%п

Индикатор меридиана (AM или PM).

13

% S

Секунды минуты (от 00 до 60).

14

% U

Номер недели текущего года, начиная с первого воскресенья как первого дня первой недели (от 00 до 53).

15

% W

Номер недели текущего года, начиная с первого понедельника в качестве первого дня первой недели (от 00 до 53).

16

% мас

День недели (воскресенье 0, 0 до 6).

17

%Икс

Предпочитаемое представление только для даты, без времени.

18

%ИКС

Предпочитаемое представление только для времени, без даты.

19

% г

Год без века (от 00 до 99).

20

% Y

Год с веком.

21

% Z

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

22

%%

Буквальный символ%.

% в

Сокращенное название дня недели (Солнце).

% A

Полное название дня недели (воскресенье).

% б

Сокращенное название месяца (январь).

% В

Полное название месяца (январь).

% с

Предпочтительное местное представление даты и времени.

% d

День месяца (с 01 по 31).

%ЧАС

Час дня, круглосуточные часы (с 00 до 23).

Час дня, 12-часовые часы (с 01 до 12).

% J

День года (от 001 до 366).

% м

Месяц года (от 01 до 12).

% M

Минута часа (от 00 до 59).

%п

Индикатор меридиана (AM или PM).

% S

Секунды минуты (от 00 до 60).

% U

Номер недели текущего года, начиная с первого воскресенья как первого дня первой недели (от 00 до 53).

% W

Номер недели текущего года, начиная с первого понедельника в качестве первого дня первой недели (от 00 до 53).

% мас

День недели (воскресенье 0, 0 до 6).

%Икс

Предпочитаемое представление только для даты, без времени.

%ИКС

Предпочитаемое представление только для времени, без даты.

% г

Год без века (от 00 до 99).

% Y

Год с веком.

% Z

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

%%

Буквальный символ%.

Арифметика времени

Вы можете выполнить простую арифметику со временем следующим образом:

Live Demo

now = Time.now          # Current time
puts now

past = now - 10         # 10 seconds ago. Time - number => Time
puts past

future = now + 10  # 10 seconds from now Time + number => Time
puts future

diff = future - past     # => 10  Time - Time => number of seconds
puts diff

Это даст следующий результат —