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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

11768閲覧

Javaの日付判定のメソッドの作り方について

pgpg

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/10/28 00:22

Javaの日付判定のメソッドの作り方について

以下のソース(まだ全然完成していません。)を見てください。

public Date judgeDay1(String inputEntryDate) {
Date d=null;

SimpleDateFormat f1 = new SimpleDateFormat("yyyy/MM/dd"); SimpleDateFormat f2 = new SimpleDateFormat("yyyyMMDD"); SimpleDateFormat f3 = new SimpleDateFormat("yyyy-MM-DD"); f1.setLenient(false); f2.setLenient(false); f3.setLenient(false); return d; }

このメソッドは戻り値がDate型で引数としてString型の文字列をわたし、フォーマットf1からf3
のいずれかにフォーマット可能なら文字列を指定のフォーマットで変換し変数dを戻り値で返す
メソッドを作りたいです。修正を出来ればお願いしたいです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

参考情報を紹介します。

...
Javaで日付文字列をパースする処理が必要になりました。 org.apache.commons.lang.time.DateUtilsを使えば複数のパターンを配列で指定できるそうなので、それを利用してやってみる。
...

↑では {"yyyy-MM-dd", "yyyy.MM.dd", "yyyy/MM/dd"} のパターンの書式を扱う例が示されています。

こんな記事も見つけました。

..
yyyy/MMという日付書式に、2010/06/15っていう文字列日付を入れてもパースできちゃうっていうのはどうゆう仕様なんだろうか。
...

org.apache.commons.lang.time.DateUtils をつくるか、自分でちょとしたパーサーを書くか?
正規表現 で桁数、セパレータを厳密にチェックをしてから、trick さんの回答にあるように
YYYYMMDD 形式など 何か1つの書式に変換してから SimpleDateFormat でparse するとよいとおもいます。

投稿2015/10/28 16:15

katoy

総合スコア22324

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

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

pgpg

2015/11/02 01:49

大変ありがとうございますそして遅れて申し訳ありません。 自己解決したのですが、とても参考になりました。ありがとうございます。
guest

0

この当たりが参考になりますかね

http://qiita.com/horimislime/items/832723eba10d2b52d9bf

http://chat-messenger.net/blog-entry-47.html

フォーマットが3つありますが、
YYYY/MM/DD や YYYY-MM-DD を YYYYMMDD にしてから
日付をチェックするのではだめですかね
引数の「inputEntryDate」から「/」、「-」をブランクにreplaceしてから
YYYYMMDDでのチェックであれば複数のフォーマットは必要ないかと思います。

投稿2015/10/28 00:52

trick

総合スコア366

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

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

0

私なら、以下のように書きます。

これなら、後でフォーマットを追加したくなった場合も
配列fsに要素を追加してやるだけで済む、というメリットがあります。

JDK1.6で動作確認しております。

java

1import java.text.ParseException; 2import java.text.SimpleDateFormat; 3import java.util.Date; 4 5public class Main { 6 7 public static void main(String[] args) { 8 Main main = new Main(); 9 10 System.out.println(main.judgeDay1("2015/10/26")); 11 System.out.println(main.judgeDay1("20151027")); 12 System.out.println(main.judgeDay1("2015-10-28")); 13 14 System.out.println(main.judgeDay1("hoge")); 15 } 16 17 public Date judgeDay1(String inputEntryDate) { 18 19 SimpleDateFormat[] fs = new SimpleDateFormat[] { 20 new SimpleDateFormat("yyyy/MM/dd"), 21 new SimpleDateFormat("yyyyMMdd"), 22 new SimpleDateFormat("yyyy-MM-dd") }; 23 24 for (SimpleDateFormat f : fs) { 25 f.setLenient(false); 26 27 try { 28 Date d = f.parse(inputEntryDate); 29 if (d != null) { 30 return d; 31 } 32 } catch (ParseException e) { 33 // Do nothing 34 } 35 } 36 37 return null; 38 } 39}

実行結果

Mon Oct 26 00:00:00 JST 2015 Tue Oct 27 00:00:00 JST 2015 Wed Oct 28 00:00:00 JST 2015 null

投稿2015/10/28 15:21

編集2015/10/28 15:31
KiyoshiMotoki

総合スコア4791

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

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

pgpg

2015/11/02 01:50

大変ありがとうございますそして遅れて申し訳ありません。 自己解決したのですが、とても参考になりました。ありがとうございます。
guest

0

足りないのは、文字列を解析するところですね。
SimpleDateFormatのparseメソッドを、f1から順に適用していって、解析できたところで答えを返せばよいと思います。
parseメソッドは、解析できない(引数の文字列が指定されたフォーマットに適合しない)場合にnullを返しますから、返り値がnullか日付かで、失敗・成功の判断ができます。

Java

1 d = f1.parse(inputEntryDate,0); 2 if (d==null) { // f1の書式では解析できなかった 3 d = f2.parse(inputEntryDate,0); 4 if (d==null) { // f2の書式では解析できなかった 5 d = f3.parse(inputEntryDate,0); 6 // f3の解析結果をそのまま返す。引数の文字列が、f1,f2,f3のいずれにも適合しな場合には、nullが返される事になる。 7 // 引数が日付に変換できなかった場合の対処として、nullを返すのではなく、例外をあげるという実装もありうる。(このプログラムの使われ方に依存する) 8 return d; 9 } else { // f2で解析出来たので、その結果の日付を返す。 10 return d; 11 } 12 } else { // f1で解析出来たので、その結果の日付を返す。 13 return d; 14 }

例えば、上記のようなコードで、"return d; "の行を置き換えてはどうでしょうか。

投稿2015/10/28 01:23

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問