2010-02-25 47 views
9

Tôi có một lô 100 nghìn bản ghi mà tôi đang nhập vào ứng dụng Rails.Phân tích ngày thành định dạng thân thiện với Rails

Có một ngày trong mỗi hàng được định dạng như sau: 03/17/81

Tuy nhiên, khi tôi cố gắng chỉ gán nó vào một trường dữ liệu, nó được chuyển đổi như sau:

ruby-1.8.7-p174 > "03/17/81".to_date 
=> Sat, 17 Mar 0081 

Cuối cùng tôi sẽ như định dạng để dẫn đến 1981-03-17

Điều này có được thực hiện tốt nhất khi nhập hoặc tôi nên ghi đè trong cấu hình Rails để đặt tiêu chuẩn ngày thành định dạng tôi cần và cách tiếp cận đúng trong Rails 2.3.5 ?

+0

làm thế nào để bạn imp ort này? Bạn có http://apidock.com/ruby/Date/strptime/class –

+0

Tôi có một tập lệnh nhập mà tôi đang chạy qua tập lệnh/runner và sử dụng FasterCSV để phân tích cú pháp dữ liệu và ActiveRecord đơn giản tạo để chèn ngày. – mwilliams

+1

Sau đó, chắc chắn đặt 'strptime' của bạn trong tập lệnh đó. –

Trả lời

19

Sử dụng

d = Date.strptime("03/17/81", "%m/%d/%y") 

Để có được nó ra trong 1981/03/17 sử dụng:

d.to_s 

Xem Date Rubydoc.

+0

Kết quả làm việc tối thiểu: 0081-03-17 –

+1

Lưu ý rằng trước ngày 1969, điều này sẽ dẫn đến thế kỷ sai: 'Date.strptime (" 12/31/68 ","% m /% d /% y ")' kết quả vào ngày 31 tháng 12 năm 2068. –

+1

Bạn có yêu cầu 'ngày' trong irb không? Cộng với% y phân biệt chữ hoa chữ thường, trường hợp này phải thấp hơn, chữ hoa có nghĩa là năm có 4 chữ số. – TheClair

1

Hãy thử mãn tính (gem install mãn tính):

require 'rubygems' 
require 'chronic' 
puts Chronic.parse "03/17/81" 
#=> Tue Mar 17 12:00:00 -0800 1981 

Trả về một đối tượng Time.

+2

Tại sao bạn nên cài đặt một Gem để thực hiện một thao tác đơn giản, bạn có thể thực hiện với một vài dòng mã? –

+5

Bởi vì một khi nó được cài đặt, nó chỉ có 2 dòng. Và nó rất * linh hoạt. – Ben

0

Không thay đổi Rails, thay đổi mã của bạn. Tôi không thấy bất kỳ vấn đề nào khi tạo một phương thức chuyển đổi chuỗi thành một ngày phù hợp.

string = "03/17/81" 
date = if string =~ %r{(\d+)/(\d+)/(\d+)} 
    Date.parse("19#{$3}-#{$1}-#{$2}") 
else 
    nil # failover 
end 
+0

đó cũng là suy nghĩ đầu tiên của tôi :) –

+1

Chúng tôi là một thập kỷ vào những năm 2000. – Ben

+0

@ Ben Thật vậy, mã có thể cần một số thay đổi. Câu hỏi đã không đặt bất kỳ yêu cầu nào về ngày 20xx. –

3

Cách thích hợp để làm điều này, nếu bạn đang đi để tái sử dụng định dạng ở nhiều nơi là để làm một cái gì đó như thế này: http://seanbehan.com/ruby-on-rails/custom-date-formats-for-your-rails-application/

Tạo một file config/initializers/date_formats.rb

... chứa này:

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
    :short_date => "%Y/%m/%d" 
) 

Sau đó, bạn sẽ thấy:

ruby-1.8.7-p174 > date = "03/17/81".to_date 
ruby-1.8.7-p174 > date.to_s(:short_date) 
#=> "1981/03/17" 
Các vấn đề liên quan