質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

4898閲覧

rubyで日付のフォーマット変換について

miyamoto0105

総合スコア216

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/01/16 02:12

2000-01-01のフォーマットの文字列をto_dateしようとしてもエラーになっております。

"07/02/2013"のフォーマットからでないと変換できないということでしょうか。
http://stackoverflow.com/questions/17795384/rails-parse-invalid-date-error

文字から日付の変換は一般的にどうされていますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

File の内容が本当にタブ区切りになっているのかを確認してみてはいかがですか?
タブ区切りのかわりにスペース区切りがあるとき,同じようなエラーが確認されました。
つまり cols[1] の値が nil になってしまうので,エラーが起きていました。
nil がありそうなところにいろいろ p して確認して見ましょう。

投稿2016/01/16 14:46

5ara5treamer

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyamoto0105

2016/01/24 14:50

すいません。部分的に変な値が入ってるのが問題でした。初歩的で申し訳ありません。
guest

0

strptime を使うのはどうですか?

require 'date'
a = Date.strptime("2000-01-01", "%Y-%m-%d")
p a.to_s
p a.strftime("%Y/%m/%d")

結果
"2000-01-01"
"2000/01/01"

投稿2016/01/16 03:20

yoshi777

総合スコア674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyamoto0105

2016/01/16 10:03

こっちのメソッドでもダメです、、、 cols[1].to_sのように書いてるのが問題そうですね。。。
guest

0

parseメソッドですね。

Ruby

1require "date" 2#=> true 3Date.parse("2000-01-01") 4#=> #<Date: 2000-01-01 ((2451545j,0s,0n),+0s,2299161j)> 5DateTime.parse("2000-01-01") 6#=> #<DateTime: 2000-01-01T00:00:00+00:00 ((2451545j,0s,0n),+0s,2299161j)>

投稿2016/01/16 03:19

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyamoto0105

2016/01/16 09:56

`parse': invalid date (ArgumentError) タブ区切りになってるファイルを読み込んでフォーマット変換してるのですがエラーになります。中身は2000-01-01のようになっています。 Encoding.default_external = 'UTF-8' books = {} File.open("List.txt", encording: "utf-8") do |f| f.each_line do |line| cols = line.chomp.split(/\t/) puts cols[1].to_s puts Date.parse(cols[1].to_s) end end
guest

0

http://docs.ruby-lang.org/ja/2.2.0/class/Date.html
↑の Ruby API ドキュメントを読むと、次のメソッドが使えそうなことがわかります。

...
httpdate(str = 'Mon, 01 Jan -4712 00:00:00 GMT', start = Date::ITALY) -> Date
[RFC2616] で定められた書式の日付を解析し、 その情報に基づいて日付オブジェクトを生成します。

iso8601(str = '-4712-01-01', start = Date::ITALY) -> Date
いくつかの代表的な [[ISO:8601]] 書式の日付を解析し、 その情報に基づいて日付オブジェクトを生成します。

parse(str = '-4712-01-01', complete = true, start = Date::ITALY) -> Date
与えられた日付表現を解析し、 その情報に基づいて日付オブジェクトを生成します。

strptime(str = '-4712-01-01', format = '%F', start = Date::ITALY) -> Date
与えられた雛型で日付表現を解析し、 その情報に基づいて日付オブジェクトを生成します。

rfc2822(), rfc822(), rfc3339() もありますが、上の 4 つから状況に応じて選べばよいとおもいます。

投稿2016/01/16 04:37

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyamoto0105

2016/01/16 10:59

下記にも書いたのですが、普通に文字指定するとうまくいくのですが、ファイルから取ると型か何かがおかしいようでエラーになってしまいます。 まだrubyの基本がわかってないような気がします。。。 > `parse': invalid date (ArgumentError) タブ区切りになってるファイルを読み込んでフォーマット変換してるのですがエラーになります。中身は2000-01-01のようになっています。 Encoding.default_external = 'UTF-8' books = {} File.open("List.txt", encording: "utf-8") do |f| f.each_line do |line| cols = line.chomp.split(/\t/) puts cols[1].to_s puts Date.parse(cols[1].to_s) end end
katoy

2016/01/16 11:54

puts cols[1].to_s を p cols[1] のようにして、その出力結果を教えてください。 あるいはプログラムをデバッガで止めて、 cols[1] を p で表示させて、その結果を教えてください。
miyamoto0105

2016/01/24 09:13

ご返答ありがとうございます。 "2015-10-30"のような結果になっております。
miyamoto0105

2016/01/24 14:51

解決いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問