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

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

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

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

Q&A

解決済

2回答

622閲覧

Ruby Date.parseの仕様

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

1グッド

1クリップ

投稿2017/11/30 04:08

編集2017/12/05 16:23

RubyのDate.parseメソッドの仕様について調べています。

このメソッドは文字列を解析してDateオブジェクトを返してくれるのですが、どのようなフォーマットを許容するのかがドキュメントにありません。

フォーマットによっては意図しない値が返ってくるのではないか、ロケールなどの環境変数によってはフォーマットも異なるのではないかという不安があり、普段はDate.strptimeを使用しています。

ソースコードを呼んで実際に検証すればいいのでしょうが、Date.parseに関するドキュメント/仕様がどこかにあるのではないかと思いここに質問させていただきました。


追記

もっとも網羅性が高い資料にDate.parseのテストコードがあることに気づきました(そりゃそうですね)。

しかしDate.parseの挙動はfalse positiveな動作をするようで

bash

1[centos@centos7 ~]$ ruby -v 2ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] 3[centos@centos7 ~]$ irb 4irb(main):001:0> require 'date' 5=> true 6irb(main):002:0> Date.parse('SHOW ME THE MONEY!!!') 7=> #<Date: 2017-12-04 ((2458092j,0s,0n),+0s,2299161j)>

なるべく日付として解釈できるよう頑張る仕組みになっているようです。

mon,sun,tue,wed,thu,fri,sat,sunなどの文字列が紛れ込むと思わぬ動作になりかねないので、やはりDate.parseは使用しないほうが良いのではないかと思っています。

scivola👍を押しています

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

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

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

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

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

guest

回答2

0

iso8601 と jisx0301 をサポートしているようです。

引用
スタックオーバーフロー

投稿2017/11/30 04:34

sakapun

総合スコア888

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

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

退会済みユーザー

退会済みユーザー

2017/12/05 16:13

ご回答ありがとうございました。 > iso8601 と jisx0301 例えば JISX0301を http://www.jisc.go.jp/app/jis/general/GnrDataBaseSearch.html で調べて「1985年4月12日」を様々なフォーマットで表現して、Date.parseにかけた結果以下のようになりました。 jisx0301で表現した年月日 | Date#parseの結果 ------ | ----- 19850412 | 1985-04-12 1985-04-12 | 1985-04-12 850412 | 1985-04-12 85-04-12 | 1985-04-12 1985W155 | 1985-04-12 1985-W15-5 | 1985-04-12 85W155 | 1985-04-12 85-W15-5 | 1985-04-12 +0119850412 | ArgumentError +011985-04-12 | 11985-04-12 -00020412 | -0002-04-12 -0002-04-12 | -0002-04-12 またjisx0301では元号も扱えます 例 | アルファベットによる表記 | 漢字による表記 ----- | ----- | ----- 1868年1月25日 | M01.01.01 | 明01.01.01 1912年7月29日 | M45.07.29 | 明45.07.29 1912年7月30日 | T01.07.30 | 大01.07.30 1926年12月24日 | T15.12.24 | 大15.12.24 1926年12月25日 | S01.12.25 | 昭01.12.25 1989年1月7日 | S64.01.07 | 昭64.01.07 1989年1月8日 | H01.01.08 | 平01.01.08 しかしDate.parseで正確にパース出来るのはアルファベットの表記のみでした そのためjisx0301に関しては「一部対応」が正しいようです。 さらに以下のフォーマットの一部も対応しているようです - rfc 850 - rfc 1123(rfc822のdate) - rfc 2822 - rfc 3339
guest

0

ベストアンサー

投稿2017/12/11 07:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問