Câu trả lời:
DateTime.strptime cho phép bạn chỉ định định dạng và chuyển đổi Chuỗi thành DateTime.
%d/%b/%Y:%H:%M:%S %Z
%Y
sẽ khớp với cả hai 2015
(như mong đợi) và 2016-foo-bar
vì nó sẽ dừng lại khi thấy 2016
. Hành vi này phù hợp với đối tác C; tuy nhiên, hàm C trả về vị trí của kết thúc khớp (ví dụ: đầu tiên -
trong trường hợp "2016") để chúng tôi quyết định xem kết hợp có chính xác hay không; trong Ruby nó trả về a DateTime
, vì vậy chúng ta không thể biết liệu có còn thứ gì sau đó hay không.
Điều này cũng không nên làm việc?
"30/Nov/2009 16:29:30 +0100".to_datetime
require 'active_support/all'
và sau đó "30/Nov/2009 16:29:30 +0100".to_datetime
(bạn không thực sự cần tất cả các phần mở rộng active_support, nhưng may mắn tìm ra những người thân mà đòi hỏi có chọn lọc)
to_datetime
thêm vào String
các đối tượng:require 'active_support/core_ext/string/conversions'
Tôi đã thành công với:
require 'time'
t = Time.parse(some_string)
Tôi đã sử dụng Time.parse("02/07/1988")
, giống như một số áp phích khác.
Một gotcha thú vị đã Time
được tải theo mặc định khi tôi mở IRB, nhưng Time.parse
không được xác định. tôi phảirequire 'time'
cho nó hoạt động.
Đó là với Ruby 2.2.
Đối với các nhà phát triển Rails Trung Quốc:
DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
trong Ruby 1.8, mô-đun ParseDate sẽ chuyển đổi định dạng này và nhiều định dạng ngày / giờ khác. Tuy nhiên, nó không giải quyết một cách duyên dáng với dấu hai chấm giữa năm và giờ. Giả sử rằng dấu hai chấm là lỗi đánh máy và thực sự là khoảng trắng, thì:
#!/usr/bin/ruby1.8
require 'parsedate'
s = "30/Nov/2009 16:29:30 +0100"
p Time.mktime(*ParseDate.parsedate(s)) # => Mon Nov 30 16:29:30 -0700 2009
Bạn cũng có thể phân tích cú pháp chuỗi ngày tháng với múi giờ nhất định:
zone = "Pacific Time (US & Canada)"
ActiveSupport::TimeZone[zone].parse("2020-05-24 18:45:00")
=> Sun, 24 May 2020 18:45:00 PDT -07:00