Computer >> Máy Tính >  >> Lập trình >> Ruby

Cách sử dụng các lớp ngày giờ của Ruby

Thời gian là một lớp trong Ruby giúp bạn thể hiện một thời điểm cụ thể.

Sau khi đọc bài viết này, bạn sẽ học mọi thứ bạn cần biết để trở thành một thuật sĩ thời gian của Ruby!

Các chủ đề được đề cập :

  • Cách chuyển đổi các chuỗi thành các đối tượng thời gian
  • Cách chia nhỏ thời gian thành các thành phần (ngày / giờ / mili giây…)
  • Cách sử dụng Date , DateTime &Time các lớp trong Ruby
  • Cách định dạng thời gian theo bất kỳ cách nào bạn muốn
  • Cách tìm sự khác biệt giữa hai Time đồ vật

Hãy làm điều này!

Lớp thời gian Ruby

Bạn có thể sử dụng Time lớp trong Ruby để đại diện cho thời gian và ngày tháng.

Ngày này có ba thành phần:

  • ngày
  • tháng
  • năm

thời gian :

  • giờ
  • phút
  • giây

Thông tin này được lưu trữ bởi Time lớp là số giây kể từ Kỷ nguyên, còn được gọi là thời gian Unix.

một số cách để khởi chạy một Time đối tượng:

  • Bạn có thể lấy một đối tượng đại diện cho thời gian hiện tại bằng cách sử dụng Time.now
  • Bạn có thể tạo Time đối tượng sử dụng dấu thời gian Unix và at phương pháp
  • Bạn có thể cung cấp ngày bắt đầu bằng số cho Time.new (định dạng:năm / tháng / ngày)

Như thế này :

Time.now
# 2018-10-19 15:43:20 +0200

Time.new(2018, 1, 1)
# 2018-01-01 00:00:00 +0100

Time.at(15000000000)
# 2017-07-14 04:40:00 +0200

Bạn có thể hỏi một đối tượng thời gian cho bất kỳ thành phần nào của nó.

Ví dụ…

Bạn có thể hỏi ngày, tháng hoặc giờ mà một đối tượng thời gian đang đại diện:

t = Time.now

puts t.day
puts t.month
puts t.hour

Ngoài ra, bạn cũng có thể hỏi xem ngày này có tương ứng với một ngày nhất định trong tuần hay không.

Ví dụ :

“Ngày này có phải là chủ nhật không?”.

Đây là các phương thức vị từ, chúng sẽ trả về true hoặc false .

Ví dụ :

t = Time.now

puts t.monday?
puts t.sunday?
puts t.friday?

Hãy thử!

Múi giờ

Một Time đối tượng có múi giờ được liên kết với nó.

Bạn có thể kiểm tra múi giờ hiện tại để biết Time đối tượng sử dụng zone phương pháp.

Điều này sẽ cung cấp cho bạn tên viết tắt của múi giờ.

Nếu bạn muốn chênh lệch múi giờ bạn có thể sử dụng utc_offset phương pháp. Kết quả đầu ra cho phương pháp này tính bằng giây, nhưng bạn có thể chia cho 3600 để lấy kết quả tính bằng giờ.

Ví dụ :

t = Time.now

t.zone
# "CET"

t.utc_offset / 3600
# 1

Bạn cũng có thể lấy thời gian hiện tại theo UTC:

Time.now.utc

Định dạng thời gian Ruby

Các định dạng Ruby Time các đối tượng theo một cách cụ thể theo mặc định.

Nhưng bạn có thể muốn một thứ khác.

Thứ gì đó thích ứng với trường hợp sử dụng của bạn .

Tin tốt!

Bạn có thể sử dụng một phương pháp để có được hầu hết bất kỳ định dạng nào bạn cần .

Phương thức này là strftime , về cơ bản có nghĩa là "thời gian định dạng".

Nó hoạt động bằng cách truyền một chuỗi với các mã định dạng, các mã định dạng này sẽ được thay thế bằng một giá trị. Nếu bạn đã từng sử dụng printf phương pháp, ý tưởng rất giống với phương pháp đó.

Hãy xem một số ví dụ :

time = Time.new

time.strftime("%d/%m/%Y")        # "05/12/2015"
time.strftime("%k:%M")           # "17:48"
time.strftime("%I:%M %p")        # "11:04 PM"
time.strftime("Today is %A")     # "Today is Sunday"
time.strftime("%d of %B, %Y")    # "21 of December, 2015"
time.strftime("Unix time is %s") # "Unix time is 1449336630"

Như bạn thấy, phương pháp này rất linh hoạt. Bạn có thể nhận được thời gian không có ngày hoặc ngày được định dạng độc đáo với năm, ngày và tên của tháng hiện tại.

Bảng định dạng Strftime

Định dạng Mô tả
% d Ngày trong tháng (01..31)
% m Tháng trong năm (01..12) Sử dụng %-m cho (1..12)
% k Giờ (0..23)
% M Phút
% S Giây (00..60)
% I Giờ (1..12)
% p SA / CH
% Y Năm
% A Ngày trong tuần (tên)
% B Tháng (tên)

Bạn có thể tìm thêm thông tin về các định dạng khác nhau có sẵn trên các liên kết sau:

  • https://strftime.net/
  • https://devdocs.io/ruby/time#method-i-strftime

Tạo Dấu thời gian

Bạn có thể tạo dấu thời gian độc lập theo múi giờ để cập nhật các sự kiện cụ thể.

Đây là cách thực hiện :

Time.now.to_i
# 1549054305

Dấu thời gian này là một số giây theo UTC (Giờ phối hợp quốc tế).

Chênh lệch thời gian (Phép cộng &Phép trừ)

Đôi khi bạn không muốn thời điểm hiện tại mà là thời điểm trong tương lai hoặc quá khứ.

Bạn có thể thực hiện phép cộng với các đối tượng thời gian!

Hãy nhớ rằng đại diện nội bộ cho Time chỉ trong vài giây, vì vậy bạn có thể thực hiện việc này:

# Add ten seconds
time = Time.new + 10

Trong ví dụ này, bạn nhận được một đối tượng thời gian được đặt cách thời điểm hiện tại 10 giây.

Sau đó, bạn có thể kiểm tra xem thời gian đó đã trôi qua chưa.

Time.new > time

Nếu bạn muốn có được thứ gì đó giống như ngày hôm qua thì bạn sẽ cần tính xem có bao nhiêu giây trong một ngày.

Như thế này :

# seconds * minutes * hours

60 * 60 * 24
# 86400

Bây giờ với con số này, chúng tôi có thể duy trì con số đó kể từ ngày hiện tại:

Time.now - 86400

Nếu bạn đang sử dụng Rails thì bạn có thể làm điều này:

Time.now - 1.day

Lớp ngày

Date lớp không có khái niệm phút, giây hay giờ. Lớp này lưu trữ mọi thứ nội bộ theo ngày.

Để sử dụng Date lớp bạn cần require 'date' .

Bạn có thể lấy ngày hiện tại bằng cách sử dụng Date.today .

Không giống như thời gian, Date.new không phải là bí danh cho today , vì vậy hãy ghi nhớ điều đó.

Date.today # Current date
Date.new   # Returns a negative date

Số học ngày tương tự như Time , sự khác biệt là bạn thêm ngày thay vì thêm giây.

Date.today + 1  # Adds one day

Một Date không biết gì về giờ, giây hoặc phút, vì vậy chỉ sử dụng lớp này nếu bạn không cần những thứ này.

Phân tích cú pháp ngày &giờ

Date.parse phương thức sẽ cố gắng phân tích cú pháp bất kỳ chuỗi nào giống như ngày tháng.

Nó sử dụng một thuật toán heuristic đơn giản để cố gắng phát hiện định dạng đầu vào.

Đôi khi điều này sẽ mang lại kết quả không mong muốn.

Ví dụ :

Date.parse("10/10/2010")  # -> 2010-10-10
Date.parse("September 3") # -> 2015-09-03
Date.parse("May I have a cup of coffee, please?") # -> 1 of May

Nếu bạn cần điều gì đó nghiêm ngặt hơn, bạn có thể sử dụng Date.iso8601 phương pháp.

iso8601 ngày có định dạng sau:

year-month-day

ArgumentError ngoại lệ sẽ được đưa ra trên đầu vào không hợp lệ.

Ví dụ :

Date.iso8601("2018-10-01")

Bạn có thể sử dụng Date.strptime phương pháp &một tập hợp các chỉ định định dạng để cung cấp định dạng đầu vào tùy chỉnh của riêng bạn. Đây là những thông số tương tự mà bạn có thể sử dụng cho strftime .

Ví dụ :

Date.strptime("3 of September", "%d of %B") # 2015-09-03

Bạn có thể phân tích thời gian bằng cách sử dụng Time lớp học.

Nói cách khác :

Cách chuyển đổi một chuỗi như ‘2018-01-01 00:00’ thành đối tượng Thời gian!

Đây là một ví dụ :

require 'time'

Time.parse("September 20 18:00")

Nếu bạn muốn cung cấp định dạng cho chuỗi đầu vào của mình, bạn có thể sử dụng strptime phương pháp.

Như thế này :

require 'time'

Time.strptime("1 of December 2017", "%d of %B %Y")

Sự khác biệt duy nhất giữa Time.parse &Date.parse là loại đối tượng mà bạn lấy lại (Time hoặc Date ).

Hằng số ngày

Date lớp có một số hằng số mà bạn có thể thấy hữu ích.

Ví dụ:có một mảng với các tháng trong năm và một mảng khác với các ngày trong tuần.

Các tháng bắt đầu từ chỉ mục 1 để bạn có thể nhận trực tiếp month number -> month name lập bản đồ.

Các ngày bắt đầu bằng Chủ nhật, nhưng bạn có thể sử dụng rotate để tuần bắt đầu vào Thứ Hai.

Date::MONTHNAMES # (index 0 = nil)
Date::DAYNAMES.rotate(1)

Lớp DateTime

DateTime lớp là một lớp con của Date và nó có thể lưu trữ giây cùng với ngày tháng.

Ví dụ :

require 'date'

DateTime.superclass
# Date

DateTime.now
# DateTime: 2018-10-15T16:06:39+02:00

Cả TimeDateTime có thể hoàn thành cùng một công việc, với sự khác biệt chính là Time được triển khai bằng C , vì vậy nó sẽ nhanh hơn.

Hiệu suất :

Comparison:
            Time:  2644596.6 i/s
        DateTime:   231634.8 i/s - 11.42x  slower

ActiveSupport - Phương pháp ngày và giờ

Nếu bạn đã sử dụng Rails, bạn có thể quen thuộc với những thứ như 3.days.ago .

Các phương thức này không có sẵn trong Ruby thuần túy, chúng được thêm vào bởi ActiveSupport thành phần của Rails.

Tại đây, bạn có thể tìm thấy một số ví dụ, hãy lưu ý cách các phương pháp này không trả về Time hoặc Date các đối tượng, nhưng một ActiveSupport tùy chỉnh lớp học.

1.hour.to_i  # 3600

1.day        # ActiveSupport::Duration
3.days.ago   # ActiveSupport::TimeWithZone

Bạn có thể tính toán thời gian với những thứ này và nhận được những thứ như ngày mai:

Time.now + 1.day

Các phương pháp thời gian dành riêng cho Rails khác:

date = Time.current

date.change(hour: 20)
date.at_beginning_of_day

Và để định dạng:

date = Date.today

date.to_formatted_s(:short) # "16 Jul"
date.to_formatted_s(:long)  # "July 16, 2018"

Mã cho các phương pháp này thực sự khá đơn giản, bạn nên xem qua. Mã nguồn của TimeWithZone cũng đáng xem.

Tóm tắt

Trong bài viết này, bạn đã tìm hiểu về các lớp Thời gian &Ngày, cách phân tích cú pháp &định dạng thời gian trong Ruby và cách sử dụng tiện ích mở rộng thời gian ActiveSupport.

Cảm ơn vì đã đọc!