2013-08-09 28 views
8

Tôi đang cố gắng phân tích một datetime với lớp Thời gian trong Ruby 2.0. Tôi không thể tìm ra cách phân tích ngày và nhận nó trong một múi giờ được chỉ định. Tôi đã sử dụng Time.zone.parse để phân tích một ngày mà lần đầu tiên tôi gọi Time.zone và đặt nó thành múi giờ được chỉ định. Trong ví dụ dưới đây, tôi đặt vùng nhưng nó không có hiệu lực strptime, tôi đã thử làm Time.zone.parse(date) nhưng tôi không thể phân tích cú pháp một ngày như dưới đây.Phân tích thời gian với strptime bằng cách sử dụng Time.zone

Time.zone = "Central Time (US & Canada)" 
#=> "Central Time (US & Canada)" 
irb(main):086:0> Time.strptime("08/26/2013 03:30 PM","%m/%d/%Y %I:%M %p") 
#=> 2013-08-26 15:30:00 -0400 
+0

Theo như tôi biết không có 'zone = 'phương pháp lớp cho 'Thời gian'. Điều này không thành công với một 'NoMethodError'? – Borodin

+0

@Borodin Không có trong Ruby, nhưng ActiveSupport thêm một số. –

Trả lời

7

Time.zone không phải là một phần của Ruby, đó là một phần của ActiveSupport (được bao gồm với Rails). Do đó, strptime không biết về bất kỳ số nào là Time.zone. Bạn có thể, tuy nhiên, chuyển đổi một Ruby Time bình thường thành một ActiveSupport::TimeWithZone sử dụng in_time_zone, trong đó sử dụng giá trị Time.zone 's theo mặc định:

require 'active_support/core_ext/time' 
Time.zone = 'Central Time (US & Canada)' 

time = Time.strptime('08/26/2013 03:30 PM', '%m/%d/%Y %I:%M %p') 
#=> 2013-08-26 15:30:00 -0400 
time.in_time_zone 
#=> Mon, 26 Aug 2013 14:30:00 CDT -05:00 
+0

@muistooshort Yea… Nếu có một điều tôi muốn mọi ngôn ngữ có thư viện Ngày/Giờ chuẩn tốt và đầy đủ. (Tất nhiên, Ruby là xa tồi tệ nhất.) –

1

Nếu bạn chỉ nhìn vào Ruby2.0, bạn có thể tìm ra thời gian lib hữu ích:

require 'time' 
time.zone # return your current time zone 

a = Time.strptime("08/26/2013 03:30 PM","%m/%d/%Y %I:%M %p") 
# => 2013-08-26 15:30:00 +1000 
a.utc # Convert to UTC 
a.local # Convert back to local 
# Or you can add/subtract the offset for the specific time zone you want: 
a - 10*3600 which gives UTC time too 
0

strptime lấy thông số của nó từ chuỗi thời gian. Như vậy, chuỗi thời gian phải chứa thông tin múi giờ.

Nếu bạn phân tích chuỗi thời gian trong một múi giờ cụ thể, nhưng chuỗi thời gian bạn nhận được không được nhúng - thì bạn có thể thêm thông tin múi giờ trước khi chuyển chuỗi thời gian đến srtptime và yêu cầu strptime để phân tích cú pháp bù trừ múi giờ bằng cách sử dụng %z hoặc tên bằng cách sử dụng %Z.

Tóm lại, nếu bạn có một chuỗi thời gian 08/26/2013 03:30 PM và bạn muốn nó phân tích cú pháp trong vùng UTC thời gian, bạn sẽ có:

str = '08/26/2013 03:30 PM' 
Time.strptime("#{str} UTC}", "%m/%d/%Y %I:%M %p %Z")