chuyển đổi Chuỗi thành DateTime


98

Tôi cần phân tích cú pháp sau Chuỗi thành Đối tượng DateTime:
30/Nov/2009:16:29:30 +0100

Có cách nào làm dễ hơn không?

Tái bút: Tôi muốn chuyển đổi chuỗi trên nguyên trạng. Dấu hai chấm sau năm không mắc lỗi chính tả. Tôi cũng muốn giải quyết vấn đề với Ruby chứ không phải RoR.

Câu trả lời:


99

DateTime.strptime cho phép bạn chỉ định định dạng và chuyển đổi Chuỗi thành DateTime.


1
cảm ơn. Nhỡ, tôi có thể cho nó định dạng của riêng tôi. Đây là kết quả hoạt động: '% d /% b /% Y:% H:% M:% S'
SkaveRat

1
@SkaveRat Chuỗi của bạn có tuân theo múi giờ không? Tôi sử dụng%d/%b/%Y:%H:%M:%S %Z
knut

4
Để biết danh sách các từ viết tắt định dạng có sẵn gist.github.com/halloffame/5350249
Ryan

8
Sẽ là lịch sự nếu chỉ định ví dụ về chuyển đổi chuỗi mà người dùng yêu cầu, không chỉ "hãy đọc ở đó" (nhân tiện, hàng tấn thông tin). Stackoverflow phổ biến không phải vì nó mang lại cho các liên kết đến các tài liệu bên ngoài, nhưng cho câu trả lời cho câu hỏi
Daniel Garmoshka

Có cách nào để làm "khớp chính xác" không? Hiện tại, hành vi đang "khớp lại từ đầu", vì vậy %Ysẽ khớp với cả hai 2015(như mong đợi) và 2016-foo-barvì 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.
Franklin Yu,

97

Điều này cũng không nên làm việc?

"30/Nov/2009 16:29:30 +0100".to_datetime

1
hoạt động tốt trong Rails 3.2.3 bằng cách sử dụng Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Thứ 4, ngày 16 tháng 5 năm 2012 02:30:00 +0000
Tilo

58
Đây cũng là một phương thức Ruby on Rails, không phải là một phương thức Ruby.
JackCA

5
Đây nên là: 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)
Matt Żukowski

2
ActiveSupport được bố trí khá khéo léo, nhưng để có ít tác động nhất, đây sẽ là tất cả những gì bạn cần để to_datetimethêm vào Stringcác đối tượng:require 'active_support/core_ext/string/conversions'
xentek 11/1213

3
Câu hỏi là về "30/11/2009: 16: 29: 30 +0100" chứ không phải "30/11/2009 16:29:30 +0100". Đó là một lý do khác tại sao nó không hoạt động.
schmijos

45

Tôi đã thành công với:

require 'time'
t = Time.parse(some_string)

15

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.parsekhông được xác định. tôi phảirequire 'time' cho nó hoạt động.

Đó là với Ruby 2.2.


12

Điều này sẽ chuyển đổi chuỗi trong ngày thành ngày giờ:

"05/05/2012".to_time

20
Đây là một phương thức Ruby on Rails, không phải là một phương thức Ruby.
JackCA

1
Mặc dù đây không phải là câu trả lời cho câu hỏi này, nhưng nó đã giúp tôi rất nhiều. Cảm ơn @ user1425976
karlingen

10

Đố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

5

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

1

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.