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

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

ただいまの
回答率

87.78%

[java][日付チェック]質問

受付中

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 2,550

score 12

java初心者です。
テキストファイルを一行づつ読み込んで行く時に、
32日や14月など、異常な日付が紛れていた場合例外として処理する方法はありますでしょうか?

while ((str = br.readLine()) != null) { // 1行ずつ読み込む
            
上記文の下に何かを配置するまではわかるのですが、
javaの日付チェックで調べてみても理解が足りず正解が出せずに困っております。

すみませんが、よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

以下の checkDate ような、日付が有効かどうかをチェックするメソッドを作成し、判定してみてはいかがでしょうか。

import java.text.DateFormat;
import java.text.ParseException;

public class sample {
    public static void main (String[] args) {

        if (checkDate("2014/01/02")){
            System.out.println("日付です");
        } else {
            System.out.println("日付ではありません");
        }
    }

    public static boolean checkDate(String strDate) {
        if (strDate == null || strDate.length() != 10) {
            return false;
        }
        DateFormat format = DateFormat.getDateInstance();
        format.setLenient(false);
        try {
            format.parse(strDate);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
参照:【Java】日付が有効かチェックする

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

正規表現を使うのはいかがでしょうか?

以下、思いつきなのですが、もし、読み込むファイルの各行に現れる日付は、必ず

日付:YYYY/MM/DD

という形式で行に出現するという前提があるとします。(あくまで仮定です。)
ここでYYYY、MM、DDは実際は半角の数字ですが、数字であっても、日付として
不正な数字の並びが入ってくる可能性がある場合に
(たとえば、"2015/6/31" など)正規表現、

String regex = "日付:([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})";

ぐらいの緩い制約でマッチさせて、3つのカッコのそれぞれで取得できる文字列を
整数に変換したうえで、

boolean isValidDate(int year, int month, int day )

のようなメソッドに渡し、もしこれが falseを返したときにこのメソッドを
使う側で何らかの例外を発生させるとよいと思います。


isValidDate メソッドでは年月日を構成する数値として正しいか
どうか、たとえば、month=6月である場合には、day=31はNGなど
の判定を行うように実装します。

参考になりましたら幸いです。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

初めまして。
CalendarやDateFormatのsetLenientを使用する方法を提案します。
try {
    Calendar cal = Calendar.getInstance();
    cal.setLenient(false);
    cal.set(year, month, day);
    cal.getTime();
} catch (IllegalArgumentException e) {
    // 日付が不正な場合の処理
}
setLenientの引数にfalseを入れると厳密な日付チェックを行います。
日付がおかしければ例外をスローするのでこれを利用するのがいいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

試しに作ってみたので参考にでもしてみて下さい

import java.io.*;
import java.util.*;
import java.nio.file.*;
public class HT{


public static void main(String[] args){


try(BufferedReader br=new BufferedReader(new FileReader("C:\\file\\files\\t.txt"));){

String str="";
int fl3=0;

while((str=br.readLine())!=null){

ArrayList<Character> i=new ArrayList<>();
for(int b=0;b<str.length();b++){

char g=str.charAt(b);

int h=(int)g;

if(48<=h && h<=57 && fl3==0){
i.add(g);

fl3=1;
}else if(48<=h && h<=57 && fl3==1){
i.add(g);

}else if(fl3==1 && (h<48 || h>57)){
fl3=0;

String j=str.substring(b,b+1);

if(j.equals("日") || j.equals("月")|| j.equals("年")){

int y=1;
int x=0;
for(int o=i.size()-1;o>=0;o--){

int r=Character.getNumericValue(i.get(o));
x=x+r*y;

y=y*10;
}
i=new ArrayList<Character>();
if(j.equals("日")){
if(x>31 || x<0){
System.out.println(x+"日");
throw new Exception();}
}
if(j.equals("月")){
if(x<0 || 12<x){
System.out.println(x+"月");
throw new Exception();}
}
if(j.equals("年")){
if(x<0){
System.out.println(x+"年");

throw new Exception();}
}


y=1;
x=0;

}



}

}



}




}catch(Exception e){

System.out.println("異常な数値が検出されました");}


}


}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る