Ruby 简明教程

Ruby - Date & Time

Time 类在 Ruby 中表示日期和时间。它是操作系统提供的时间和日期功能之上的一层薄应用。在您的系统上,此类可能无法表示 1970 年之前或 2038 年之后的日期。

The Time class represents dates and times in Ruby. It is a thin layer over the system date and time functionality provided by the operating system. This class may be unable on your system to represent dates before 1970 or after 2038.

本章使您熟悉所有最需要的日期和时间概念。

This chapter makes you familiar with all the most wanted concepts of date and time.

Getting Current Date and Time

以下是获取当前日期和时间的简单示例 -

Following is the simple example to get current date and time −

#!/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

这会产生以下结果 −

This will produce the following result −

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

Getting Components of a Date & Time

我们可以使用 Time 对象获取日期和时间的各种组成部分。以下是显示相同的示例 -

We can use Time object to get various components of date and time. Following is the example showing the same −

#!/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

这会产生以下结果 −

This will produce the following result −

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

Time.utc, Time.gm and Time.local Functions

可以使用这两个函数以标准格式设置日期,如下所示 -

These two functions can be used to format date in a standard format as follows −

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

以下是将所有组件获取为以下格式的数组的示例 -

Following is the example to get all the components in an array in the following format −

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

尝试以下操作 -

Try the following −

#!/usr/bin/ruby -w

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

这将生成以下结果 -

This will generate the following result −

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

此数组可以传递给 Time.utc 或 Time.local 函数以获取不同格式的日期,如下所示 -

This array could be passed to Time.utc or Time.local functions to get different format of dates as follows −

#!/usr/bin/ruby -w

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

这将生成以下结果 -

This will generate the following result −

Mon Jun 02 12:15:36 UTC 2008

以下是获取时间的方式:表示为自平台相关历元起的秒数

Following is the way to get time represented internally as seconds since the (platform-dependent) epoch −

# 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

Timezones and Daylight Savings Time

可以使用 Time 对象来获取所有与时区和夏令时相关的信息,如下所示 -

You can use a Time object to get all the information related to Timezones and daylight savings as follows −

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

Formatting Times and Dates

有多种格式化日期和时间的方法。这里是一个显示一些示例的示例 -

There are various ways to format date and time. Here is one example showing a few −

#!/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")

这会产生以下结果 −

This will produce the following result −

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 Formatting Directives

以下表格中的这些指令与方法 Time.strftime 一起使用。

These directives in the following table are used with the method Time.strftime.

Sr.No.

Directive & Description

1

%a The abbreviated weekday name (Sun).

2

%A The full weekday name (Sunday).

3

%b The abbreviated month name (Jan).

4

%B The full month name (January).

5

%c The preferred local date and time representation.

6

%d Day of the month (01 to 31).

7

%H Hour of the day, 24-hour clock (00 to 23).

8

%I Hour of the day, 12-hour clock (01 to 12).

9

%j Day of the year (001 to 366).

10

%m Month of the year (01 to 12).

11

%M Minute of the hour (00 to 59).

12

%p Meridian indicator (AM or PM).

13

%S Second of the minute (00 to 60).

14

%U Week number of the current year, starting with the first Sunday as the first day of the first week (00 to 53).

15

%W Week number of the current year, starting with the first Monday as the first day of the first week (00 to 53).

16

%w Day of the week (Sunday is 0, 0 to 6).

17

%x Preferred representation for the date alone, no time.

18

%X Preferred representation for the time alone, no date.

19

%y Year without a century (00 to 99).

20

%Y Year with century.

21

%Z Time zone name.

22

%% Literal % character.

Time Arithmetic

你可以使用以下方法对时间执行简单的算术运算:

You can perform simple arithmetic with time as follows −

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

这会产生以下结果 −

This will produce the following result −

Thu Aug 01 20:57:05 -0700 2013
Thu Aug 01 20:56:55 -0700 2013
Thu Aug 01 20:57:15 -0700 2013
20.0